From f51b91ab4f009f9146990948dbab249d5445fc04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kov=C3=A1cs=20L=C3=A1szl=C3=B3?= Date: Fri, 8 Mar 2024 18:58:01 +0100 Subject: [PATCH 01/31] renamed projs, fixed different issues, added disclaimers --- .gitignore | 2 +- README.md | 8 +- category-pages/labs.html | 8 +- .../.cproject | 64 - .../src-gen/.gitignore | 10 - .../src/main.py | 70 - .../.cproject | 182 - .../.project | 40 - .../.cproject | 177 - .../.cproject | 177 - .../.project | 17 - .../.cproject | 70 - .../.project | 17 + .../css/style.css | 0 .../images/childfirst.png | Bin .../images/lights_thumb.jpg | Bin .../images/model.png | Bin .../images/parentfirst.png | Bin .../index.html | 0 .../metadata.json | 2 +- .../models/childfirst.ysc | 2 +- .../models/parentfirst.ysc | 2 +- .../.project | 2 +- .../.project | 2 +- .../EventBuffersDisabled.ysc | 2 +- .../EventBuffersEnabled.ysc | 2 +- .../css/style.css | 0 .../images/EventBuffersEnabled1.png | Bin .../images/EventBuffersEnabled2.png | Bin .../images/EventBuffersEnabled3.png | Bin .../images/lights_thumb.jpg | Bin .../index.html | 0 .../metadata.json | 2 +- .../.project | 17 + .../css/style.css | 0 .../images/cyclebased.png | Bin .../images/eventdriven.png | Bin .../images/lights_thumb.jpg | Bin .../images/model.png | Bin .../index.html | 2 +- .../metadata.json | 2 +- .../models/cyclebased.ysc | 2 +- .../models/eventdriven.ysc | 2 +- .../.project | 2 +- .../css/style.css | 0 .../images/01_no_hierarchy.png | Bin .../images/02_composite_states.png | Bin .../images/03_nested_composite_states.png | Bin .../images/04_subdiagrams.png | Bin .../images/lights_thumb.jpg | Bin .../index.html | 2 +- .../metadata.json | 2 +- .../models/01_no_hierarchy.ysc | 2 +- .../models/02_composite_states.ysc | 2 +- .../models/03_nested_composite_states.ysc | 2 +- .../models/04_subdiagrams.ysc | 6 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/change_entry_kind.png | Bin .../images/deep_history.png | Bin .../images/lights_thumb.jpg | Bin .../images/no_history.png | Bin .../images/shallow_history.png | Bin .../index.html | 2 +- .../metadata.json | 2 +- .../models/01_no_history.ysc | 2 +- .../models/02_shallow_history.ysc | 2 +- .../models/03_deep_history.ysc | 2 +- .../.project | 2 +- .../css/style.css | 0 .../images/lights_thumb.jpg | Bin .../images/multism.gif | Bin .../index.html | 0 .../metadata.json | 2 +- .../model/controller.ysc | 2 +- .../model/led.ysc | 2 +- .../.project | 17 + .../css/style.css | 0 .../images/event-raising.png | Bin .../images/keyboard.png | Bin .../images/lights_thumb.jpg | Bin .../images/orthogonality.png | Bin .../index.html | 2 +- .../metadata.json | 2 +- .../model/keyboard.ysc | 2 +- .../model/orthogonality.ysc | 2 +- .../.project | 17 + .../css/style.css | 0 .../images/SuperSteps1.png | Bin .../images/SuperSteps2.png | Bin .../images/SuperStepsSimple.png | Bin .../images/lights_thumb.jpg | Bin .../index.html | 0 .../metadata.json | 2 +- .../models/SuperStepsDisabled.ysc | 2 +- .../models/SuperStepsEnabled.ysc | 2 +- .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../css/ypi.css | 4 +- .../images/01_light_switch.png | Bin .../images/02_light_switch.png | Bin .../images/03_light_switch.png | Bin .../images/04_light_switch.png | Bin .../images/05_light_switch.png | Bin .../images/lights.jpg | Bin .../images/lights_thumb.jpg | Bin .../index.html | 12 +- .../metadata.json | 4 +- .../model/01_basic/01.sgen | 16 + .../model/01_basic/01_LightSwitch.ysc | 2 +- .../model/02_dimmer/02.sgen | 16 + .../02_dimmer/02_DimmableLightSwitch.ysc | 2 +- .../model/03_motionsense/03.sgen | 8 +- .../03_motionsense/03_MotionLightSwitch.ysc | 2 +- .../04_LightAndMotionSensingLightSwitch.ysc | 2 +- .../model/05_presencesimulation/05.sgen | 16 + .../05_PresenceSimulationLightSwitch.ysc | 2 +- .../src-gen/.gitignore | 0 .../src/itemis/create/IEventDriven.java | 13 + .../src/itemis/create/IStatemachine.java | 30 + .../src/itemis/create/ITimed.java | 23 + .../src/itemis/create/ITimerService.java | 27 + .../src/itemis/create/TimerService.java | 110 + .../src/itemis/create/VirtualTimer.java | 211 + .../examples/lightswitch/LightSwitch_01.java | 4 +- .../examples/lightswitch/LightSwitch_02.java | 4 +- .../examples/lightswitch/LightSwitch_03.java | 6 +- .../examples/lightswitch/LightSwitch_05.java | 8 +- .../.cproject | 43 + .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/arduino.jpg | Bin .../index.html | 122 +- .../main.ino | 0 .../metadata.json | 2 +- .../model/Arduino_Blinky_SCT.sgen | 4 +- .../model/Arduino_Blinky_SCT.ysc | 2 +- .../.cproject | 4 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/content-assist.gif | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 8 +- .../metadata.json | 2 +- .../models/c.sgen | 4 +- .../models/light_switch.ysc | 2 +- .../src/main.c | 0 .../.cproject | 6 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/content-assist.gif | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/cpp.sgen | 4 +- .../models/light_switch.ysc | 2 +- .../src/main.cpp | 0 .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/content-assist.gif | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/java.sgen | 6 +- .../models/light_switch.ysc | 2 +- .../create}/examples/codegen/java/Main.java | 6 +- .../.cproject | 44 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/light.png | Bin .../images/light_controller_defsection.png | Bin .../images/light_controller_machine.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/c.sgen | 4 +- .../models/light.ysc | 2 +- .../models/light_controller.ysc | 2 +- .../src/main.c | 2 +- .../.cproject | 46 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/light.png | Bin .../images/light_controller_defsection.png | Bin .../images/light_controller_machine.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../models/cpp.sgen | 4 +- .../models/light.ysc | 2 +- .../models/light_controller.ysc | 2 +- .../src/main.cpp | 6 +- .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/console.png | Bin .../images/light.png | Bin .../images/light_controller_defsection.png | Bin .../images/light_controller_machine.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../models/java.sgen | 8 +- .../models/light.ysc | 2 +- .../models/light_controller.ysc | 2 +- .../examples/codegen/multism/java/Main.java | 8 +- .../.gitignore | 0 .../.project | 2 +- .../.pydevproject | 0 .../css/style.css | 0 .../images/console.png | Bin .../images/light.png | Bin .../images/light_controller_defsection.png | Bin .../images/light_controller_machine.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../models/light.ysc | 2 +- .../models/light_controller.ysc | 2 +- .../models/python.sgen | 4 +- .../.gitignore | 0 .../.project | 2 +- .../.pydevproject | 0 .../css/style.css | 0 .../images/console.png | Bin .../images/content-assist.gif | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/light_switch.ysc | 2 +- .../models/python.sgen | 4 +- .../.project | 2 +- .../css/style.css | 0 .../images/content-assist.gif | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../models/light_switch.ysc | 2 +- .../models/scxml.sgen | 4 +- .../src-gen/LightSwitch.scxml | 33 + .../.cproject | 28 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/CodeCompletion.png | Bin .../images/CoffeeMachine_model.png | Bin .../images/coffee_machine.jpg | Bin .../images/coffee_machine_thumb.jpg | Bin .../images/console.png | Bin .../index.html | 3 +- .../main.c | 2 +- .../metadata.json | 4 +- .../model/CoffeeMachine.sgen | 4 +- .../model/CoffeeMachine.ysc | 12 +- .../src/cm_hmi.c | 0 .../src/cm_hmi.h | 0 .../src/cm_trace.c | 0 .../src/cm_trace.h | 0 .../src/coffee_machine.c | 0 .../src/coffee_machine.h | 0 .../tests/CoffeeMachineTest.sctunit | 0 .../.cproject | 44 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/CoffeeMachineCpp_0.png | Bin .../images/coffee_machine.jpg | Bin .../images/coffee_machine_thumb.jpg | Bin .../images/functions.png | Bin .../images/simulationview.png | Bin .../index.html | 2 +- .../main.cpp | 0 .../metadata.json | 4 +- .../model/CoffeeMachineCpp.sgen | 4 +- .../model/CoffeeMachineCpp.ysc | 16 +- .../src/CMHMI.cpp | 0 .../src/CMHMI.hpp | 0 .../src/CMTracing.cpp | 0 .../src/CMTracing.h | 0 .../src/CoffeeMachine.cpp | 0 .../src/CoffeeMachine.hpp | 0 .../.cproject | 18 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/DigitalWatch.jpg | Bin .../images/digital_watch_thumb.jpg | Bin .../index.html | 0 .../main.ino | 0 .../metadata.json | 2 +- .../model/DigitalWatch.sgen | 4 +- .../model/DigitalWatch.ysc | 6 +- .../src/DisplayHandler.cpp | 0 .../src/DisplayHandler.h | 0 .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/digital_watch.jpg | Bin .../images/digital_watch_thumb.jpg | Bin .../images/subdiagram.png | Bin .../images/watch.png | Bin .../images/watch_declaration.png | Bin .../images/watch_subdiagrams.png | Bin .../index.html | 2 +- .../metadata.json | 2 +- .../model/watch.ysc | 2 +- .../model/watch_subdiagrams.ysc | 6 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/elevator.jpg | Bin .../index.html | 2 +- .../metadata.json | 4 +- .../model/Elevator.ysc | 2 +- .../test/elevator.sctunit | 312 +- .../.cproject | 0 .../.gitignore | 0 .../.project | 2 +- .../CMakeLists.txt | 2 +- .../Makefile | 0 .../images/blinky.png | Bin .../images/runas.png | Bin .../images/wifi_settings.png | Bin .../images/yet_target_trace_debugging.png | Bin .../index.html | 6 +- .../main/CMakeLists.txt | 0 .../main/Kconfig.projbuild | 0 .../main/component.mk | 0 .../main/hmi.c | 0 .../main/hmi.h | 0 .../main/main.c | 2 +- .../main/sc/util/yet_logger.c | 0 .../main/sc/util/yet_logger.h | 0 .../main/sc/util/yet_udp_stream.c | 0 .../main/sc/util/yet_udp_stream.h | 0 .../metadata.json | 4 +- .../model/blink.ysc | 2 +- .../model/sm.sgen | 4 +- .../model/yet.sgen | 4 +- .../sdkconfig | 0 .../.cproject | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/model.png | Bin .../images/results.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/BouncingBall.sgen | 4 +- .../models/BouncingBall.ysc | 2 +- .../.cproject | 18 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/ArduinoHMI.jpeg | Bin .../images/ArduinoHMISimple.jpeg | Bin .../images/Counter.jpeg | Bin .../images/HMI_LCD.jpeg | Bin .../images/HandleStates.jpeg | Bin .../images/StopWatch.jpeg | Bin .../images/defnitionSection.jpeg | Bin .../index.html | 168 +- .../main.ino | 0 .../metadata.json | 2 +- .../model/ArduinoHMI.sgen | 4 +- .../model/ArduinoHMI.ysc | 12 +- .../src/DisplayHandler.cpp | 0 .../src/DisplayHandler.h | 0 .../.cproject | 20 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/embedded_system.jpg | Bin .../images/platform_integration_example.jpeg | Bin .../index.html | 0 .../main.ino | 0 .../metadata.json | 2 +- .../model/CodeGenerator.sgen | 28 +- .../model/StateMachine.ysc | 2 +- .../src/hw_impl.c | 0 .../src/hw_impl.h | 0 .../src/timer_impl.c | 0 .../src/timer_impl.h | 0 .../.cproject | 30 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/embedded_system.jpg | Bin .../images/platform_integration_example.jpeg | Bin .../index.html | 0 .../main.ino | 0 .../metadata.json | 2 +- .../model/CodeGenerator.sgen | 28 +- .../model/StateMachine.ysc | 2 +- .../src/hw_impl.c | 104 +- .../src/hw_impl.h | 82 +- .../src/timer_impl.c | 80 +- .../src/timer_impl.h | 42 +- .../.cproject | 14 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../YAKINDU-Statecharts-Arduino_thumb.jpg | Bin .../index.html | 2 +- .../main.ino | 0 .../metadata.json | 6 +- .../model/LightCtrl.sgen | 4 +- .../model/LightCtrl.ysc | 2 +- .../.ccsproject | 0 .../.cproject | 86 + .../.gitignore | 0 .../.launches/msp430_sct_plugin_blink.launch | 0 .../.launches/msp430_sctpro_blink.launch | 0 .../.project | 2 +- .../blinkyStateMachine.sgen | 4 +- .../blinkyStateMachine.ysc | 2 +- .../css/style.css | 0 .../images/AddNeon.png | Bin .../images/DownloadOptions.png | Bin .../images/ShortcutPath.png | Bin .../images/addStatechart.png | Bin .../images/blinkyStateMachine.png | Bin .../images/c99.png | Bin .../images/emptySCT.png | Bin .../images/installNewSoftware.png | Bin .../images/installSCT.png | Bin .../images/msp430.jpg | Bin .../images/msp430_thumb.jpg | Bin .../images/proSCT.png | Bin .../images/projectView.png | Bin .../images/sgen.png | Bin .../images/stateSCT.png | Bin .../index.html | 24 +- .../lnk_msp430g2553.cmd | 0 .../main.c | 0 .../metadata.json | 4 +- .../msp430g2553.h | 0 .../targetConfigs/MSP430G2553.ccxml | 0 .../targetConfigs/readme.txt | 0 .../.cproject | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/header.jpg | Bin .../images/sct.png | Bin .../index.html | 0 .../metadata.json | 2 +- .../rgb.sgen | 4 +- .../rgb.ysc | 2 +- .../scutil/sc_cycle_runner.c | 0 .../scutil/sc_cycle_runner.h | 2 +- .../src/gpio_util.c | 0 .../src/gpio_util.h | 0 .../src/main.c | 0 .../.cproject | 6 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/linker_libraries.png | Bin .../images/model.png | Bin .../images/testoutput.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/c.sgen | 4 +- .../models/light_switch.ysc | 2 +- .../tests/c_test.sgen | 4 +- .../tests/light_switch_test.sctunit | 0 .../.cproject | 6 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/linker_libraries.png | Bin .../images/model.png | Bin .../images/testoutput.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/cpp.sgen | 4 +- .../models/light_switch.ysc | 2 +- .../tests/cpp_test.sgen | 4 +- .../tests/light_switch_test.sctunit | 0 .../.classpath | 5 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/build_path.png | Bin .../images/model.png | Bin .../images/testoutput.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../lib/byte-buddy-1.12.19.jar | Bin 0 -> 3958480 bytes .../lib/byte-buddy-agent-1.12.19.jar | Bin 0 -> 256421 bytes .../lib/mockito-core-4.10.0.jar | Bin 0 -> 683220 bytes .../lib/objenesis-3.3.jar | Bin 0 -> 49423 bytes .../metadata.json | 2 +- .../models/java.sgen | 4 +- .../models/light_switch.ysc | 2 +- .../tests/java_test.sgen | 4 +- .../tests/light_switch_test.sctunit | 0 .../.gitignore | 0 .../.project | 2 +- .../.pydevproject | 0 .../css/style.css | 0 .../images/model.png | Bin .../images/testoutput.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/light_switch.ysc | 2 +- .../models/python.sgen | 4 +- .../tests/light_switch_test.sctunit | 0 .../tests/python_test.sgen | 4 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/coverage_model_1.png | Bin .../images/coverage_report_1.png | Bin .../images/model.png | Bin .../images/watch_gears_thumb.jpg | Bin .../index.html | 6 +- .../metadata.json | 2 +- .../models/light_switch.ysc | 2 +- .../tests/light_switch_test.sctunit | 0 .../.cproject | 98 + .../.gitignore | 0 .../.project | 2 +- .../Core/Inc/main.h | 142 +- .../Core/Inc/sc_timer_service.h | 2 +- .../Core/Inc/stm32f4xx_hal_conf.h | 886 +- .../Core/Inc/stm32f4xx_it.h | 140 +- .../Core/Src/main.c | 552 +- .../Core/Src/sc_timer_service.c | 0 .../Core/Src/stm32f4xx_hal_msp.c | 268 +- .../Core/Src/stm32f4xx_it.c | 434 +- .../Core/Src/syscalls.c | 0 .../Core/Src/sysmem.c | 0 .../Core/Src/system_stm32f4xx.c | 1454 +- .../Core/Startup/startup_stm32f407vgtx.s | 1010 +- .../Device/ST/STM32F4xx/Include/stm32f407xx.h | 31188 ++++++++-------- .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 506 +- .../ST/STM32F4xx/Include/system_stm32f4xx.h | 244 +- .../Drivers/CMSIS/Include/cmsis_armcc.h | 1730 +- .../Drivers/CMSIS/Include/cmsis_armclang.h | 3738 +- .../Drivers/CMSIS/Include/cmsis_compiler.h | 532 +- .../Drivers/CMSIS/Include/cmsis_gcc.h | 4170 +-- .../Drivers/CMSIS/Include/cmsis_iccarm.h | 1870 +- .../Drivers/CMSIS/Include/cmsis_version.h | 78 +- .../Drivers/CMSIS/Include/core_armv8mbl.h | 3836 +- .../Drivers/CMSIS/Include/core_armv8mml.h | 5854 +-- .../Drivers/CMSIS/Include/core_cm0.h | 1898 +- .../Drivers/CMSIS/Include/core_cm0plus.h | 2166 +- .../Drivers/CMSIS/Include/core_cm1.h | 1952 +- .../Drivers/CMSIS/Include/core_cm23.h | 3986 +- .../Drivers/CMSIS/Include/core_cm3.h | 3882 +- .../Drivers/CMSIS/Include/core_cm33.h | 6004 +-- .../Drivers/CMSIS/Include/core_cm4.h | 4258 +-- .../Drivers/CMSIS/Include/core_cm7.h | 5342 +-- .../Drivers/CMSIS/Include/core_sc000.h | 2044 +- .../Drivers/CMSIS/Include/core_sc300.h | 3830 +- .../Drivers/CMSIS/Include/mpu_armv7.h | 540 +- .../Drivers/CMSIS/Include/mpu_armv8.h | 666 +- .../Drivers/CMSIS/Include/tz_context.h | 140 +- .../Inc/Legacy/stm32_hal_legacy.h | 7552 ++-- .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 596 +- .../Inc/stm32f4xx_hal_cortex.h | 820 +- .../Inc/stm32f4xx_hal_def.h | 394 +- .../Inc/stm32f4xx_hal_dma.h | 1608 +- .../Inc/stm32f4xx_hal_dma_ex.h | 208 +- .../Inc/stm32f4xx_hal_exti.h | 736 +- .../Inc/stm32f4xx_hal_flash.h | 856 +- .../Inc/stm32f4xx_hal_flash_ex.h | 2132 +- .../Inc/stm32f4xx_hal_flash_ramfunc.h | 158 +- .../Inc/stm32f4xx_hal_gpio.h | 618 +- .../Inc/stm32f4xx_hal_gpio_ex.h | 3184 +- .../Inc/stm32f4xx_hal_pwr.h | 862 +- .../Inc/stm32f4xx_hal_pwr_ex.h | 688 +- .../Inc/stm32f4xx_hal_rcc.h | 2928 +- .../Inc/stm32f4xx_hal_rcc_ex.h | 14276 +++---- .../Inc/stm32f4xx_hal_tim.h | 4060 +- .../Inc/stm32f4xx_hal_tim_ex.h | 712 +- .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 1230 +- .../Src/stm32f4xx_hal_cortex.c | 1010 +- .../Src/stm32f4xx_hal_dma.c | 2610 +- .../Src/stm32f4xx_hal_dma_ex.c | 630 +- .../Src/stm32f4xx_hal_exti.c | 1118 +- .../Src/stm32f4xx_hal_flash.c | 1556 +- .../Src/stm32f4xx_hal_flash_ex.c | 2700 +- .../Src/stm32f4xx_hal_flash_ramfunc.c | 350 +- .../Src/stm32f4xx_hal_gpio.c | 1074 +- .../Src/stm32f4xx_hal_pwr.c | 1118 +- .../Src/stm32f4xx_hal_pwr_ex.c | 1208 +- .../Src/stm32f4xx_hal_rcc.c | 2228 +- .../Src/stm32f4xx_hal_rcc_ex.c | 7508 ++-- .../Src/stm32f4xx_hal_tim.c | 13308 +++---- .../Src/stm32f4xx_hal_tim_ex.c | 3956 +- .../STM32F407VGTX_FLASH.ld | 0 .../STM32F407VGTX_RAM.ld | 0 ...akindu.sct.examples.stm32f407vg.blinky.ioc | 4 +- .../css/style.css | 0 .../images/stm.png | Bin .../images/stm_configuration.png | Bin .../images/stm_preview.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../model/blinky.ysc | 2 +- .../model/generator.sgen | 4 +- .../.cproject | 98 + .../.gitignore | 0 .../.project | 2 +- .../Core/Inc/main.h | 142 +- .../Core/Inc/sc_timer_service.h | 2 +- .../Core/Inc/stm32f4xx_hal_conf.h | 886 +- .../Core/Inc/stm32f4xx_it.h | 140 +- .../Core/Src/main.c | 588 +- .../Core/Src/sc_timer_service.c | 2 +- .../Core/Src/stm32f4xx_hal_msp.c | 268 +- .../Core/Src/stm32f4xx_it.c | 434 +- .../Core/Src/syscalls.c | 0 .../Core/Src/sysmem.c | 0 .../Core/Src/system_stm32f4xx.c | 1454 +- .../Core/Startup/startup_stm32f407vgtx.s | 1010 +- .../Device/ST/STM32F4xx/Include/stm32f407xx.h | 31188 ++++++++-------- .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 506 +- .../ST/STM32F4xx/Include/system_stm32f4xx.h | 244 +- .../Drivers/CMSIS/Include/cmsis_armcc.h | 1730 +- .../Drivers/CMSIS/Include/cmsis_armclang.h | 3738 +- .../Drivers/CMSIS/Include/cmsis_compiler.h | 532 +- .../Drivers/CMSIS/Include/cmsis_gcc.h | 4170 +-- .../Drivers/CMSIS/Include/cmsis_iccarm.h | 1870 +- .../Drivers/CMSIS/Include/cmsis_version.h | 78 +- .../Drivers/CMSIS/Include/core_armv8mbl.h | 3836 +- .../Drivers/CMSIS/Include/core_armv8mml.h | 5854 +-- .../Drivers/CMSIS/Include/core_cm0.h | 1898 +- .../Drivers/CMSIS/Include/core_cm0plus.h | 2166 +- .../Drivers/CMSIS/Include/core_cm1.h | 1952 +- .../Drivers/CMSIS/Include/core_cm23.h | 3986 +- .../Drivers/CMSIS/Include/core_cm3.h | 3882 +- .../Drivers/CMSIS/Include/core_cm33.h | 6004 +-- .../Drivers/CMSIS/Include/core_cm4.h | 4258 +-- .../Drivers/CMSIS/Include/core_cm7.h | 5342 +-- .../Drivers/CMSIS/Include/core_sc000.h | 2044 +- .../Drivers/CMSIS/Include/core_sc300.h | 3830 +- .../Drivers/CMSIS/Include/mpu_armv7.h | 540 +- .../Drivers/CMSIS/Include/mpu_armv8.h | 666 +- .../Drivers/CMSIS/Include/tz_context.h | 140 +- .../Inc/Legacy/stm32_hal_legacy.h | 7552 ++-- .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 596 +- .../Inc/stm32f4xx_hal_cortex.h | 820 +- .../Inc/stm32f4xx_hal_def.h | 394 +- .../Inc/stm32f4xx_hal_dma.h | 1608 +- .../Inc/stm32f4xx_hal_dma_ex.h | 208 +- .../Inc/stm32f4xx_hal_exti.h | 736 +- .../Inc/stm32f4xx_hal_flash.h | 856 +- .../Inc/stm32f4xx_hal_flash_ex.h | 2132 +- .../Inc/stm32f4xx_hal_flash_ramfunc.h | 158 +- .../Inc/stm32f4xx_hal_gpio.h | 618 +- .../Inc/stm32f4xx_hal_gpio_ex.h | 3184 +- .../Inc/stm32f4xx_hal_pwr.h | 862 +- .../Inc/stm32f4xx_hal_pwr_ex.h | 688 +- .../Inc/stm32f4xx_hal_rcc.h | 2928 +- .../Inc/stm32f4xx_hal_rcc_ex.h | 14276 +++---- .../Inc/stm32f4xx_hal_tim.h | 4060 +- .../Inc/stm32f4xx_hal_tim_ex.h | 712 +- .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 1230 +- .../Src/stm32f4xx_hal_cortex.c | 1010 +- .../Src/stm32f4xx_hal_dma.c | 2610 +- .../Src/stm32f4xx_hal_dma_ex.c | 630 +- .../Src/stm32f4xx_hal_exti.c | 1118 +- .../Src/stm32f4xx_hal_flash.c | 1556 +- .../Src/stm32f4xx_hal_flash_ex.c | 2700 +- .../Src/stm32f4xx_hal_flash_ramfunc.c | 350 +- .../Src/stm32f4xx_hal_gpio.c | 1074 +- .../Src/stm32f4xx_hal_pwr.c | 1118 +- .../Src/stm32f4xx_hal_pwr_ex.c | 1208 +- .../Src/stm32f4xx_hal_rcc.c | 2228 +- .../Src/stm32f4xx_hal_rcc_ex.c | 7508 ++-- .../Src/stm32f4xx_hal_tim.c | 13308 +++---- .../Src/stm32f4xx_hal_tim_ex.c | 3956 +- .../STM32F407VGTX_FLASH.ld | 0 .../STM32F407VGTX_RAM.ld | 0 ...ct.examples.stm32f407vg.multism.blinky.ioc | 4 +- .../css/style.css | 0 .../images/stm.png | Bin .../images/stm2.png | Bin .../images/stm_configuration.png | Bin .../images/stm_preview.jpg | Bin .../index.html | 4 +- .../metadata.json | 2 +- .../model/LED.ysc | 2 +- .../model/controller.ysc | 2 +- .../model/generator.sgen | 0 .../.cproject | 10 +- .../.gitignore | 0 .../.project | 6 +- .../.tictoc.sctunit.xml | 5 + .../hmi.c | 0 .../hmi.h | 0 .../images/tictoc_debugging.png | Bin .../images/yet_configure_trace_debugging.png | Bin .../images/yet_launch_trace_debugging.png | Bin .../images/yet_target_trace_debugging.png | Bin .../index.html | 6 +- .../main.c | 0 .../metadata.json | 4 +- .../sc/util/yet_file.c | 0 .../sc/util/yet_file.h | 0 .../sc/util/yet_logger.c | 0 .../sc/util/yet_logger.h | 0 .../sc/util/yet_udp_stream.c | 0 .../sc/util/yet_udp_stream.h | 0 .../tictoc.sct | 2 +- .../tictoc_sm.sgen | 2 +- .../tictoc_trace.sgen | 2 +- .../trace.yet | 0 .../.cproject | 12 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/TrafficLightCtrl.png | Bin .../images/YAKINDU-Statecharts-Arduino.jpg | Bin .../YAKINDU-Statecharts-Arduino_thumb.jpg | Bin .../images/arduino_1.jpg | Bin .../images/arduino_2.jpg | Bin .../images/arduino_buttons.png | Bin .../images/screenshot_installhardware.png | Bin .../index.html | 0 .../metadata.json | 4 +- .../model/TrafficLightCtrl.sgen | 2 +- .../model/TrafficLightCtrl.ysc | 2 +- .../pushbutton.c | 0 .../pushbutton.h | 0 .../traffic_light_arduino.ino | 0 .../.cproject | 12 +- .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/TrafficLightCtrl.png | Bin .../images/YAKINDU-Statecharts-Arduino.jpg | Bin .../YAKINDU-Statecharts-Arduino_thumb.jpg | Bin .../images/arduino-traffic-light.png | Bin .../images/arduino_1.jpg | Bin .../images/arduino_2.jpg | Bin .../images/arduino_buttons.png | Bin .../images/screenshot_installhardware.png | Bin .../index.html | 236 +- .../main.ino | 0 .../metadata.json | 2 +- .../model/TrafficLightCtrl.sgen | 2 +- .../model/TrafficLightCtrl.ysc | 2 +- .../src/PushButton.cpp | 0 .../src/PushButton.h | 0 .../src/TrafficLightOCBs.cpp | 0 .../src/TrafficLightOCBs.h | 0 .../src/arduinoPins.h | 0 .../.cproject | 6 +- .../.project | 6 +- .../css/style.css | 0 .../images/traffic_light.jpg | Bin .../images/trafficlights.png | Bin .../images/trafficlights_sc.png | Bin .../implementation/images/background.png | Bin .../implementation/images/green.png | Bin .../implementation/images/pause.png | Bin .../implementation/images/play.png | Bin .../implementation/images/red.png | Bin .../implementation/images/yellow.png | Bin .../machine/TrafficLightStateMachine.cpp | 821 + .../machine/TrafficLightStateMachine.h | 264 + .../implementation/machine/sc_cyclebased.h | 28 + .../implementation/machine/sc_eventdriven.h | 28 + .../machine/sc_qt_timerservice.cpp | 119 + .../machine/sc_qt_timerservice.h | 73 + .../implementation/machine/sc_rxcpp.h | 165 + .../implementation/machine/sc_statemachine.h | 44 + .../implementation/machine/sc_timer.h | 75 + .../implementation/machine/sc_types.h | 26 + .../implementation/main.cpp | 0 .../implementation/main.qml | 2 +- .../implementation/qml.qrc | 0 .../implementation/trafficlight-qt-cpp.pro | 0 .../index.html | 10 +- .../metadata.json | 4 +- .../model/TrafficLightStateMachine.sgen | 2 +- .../model/TrafficLightStateMachine.ysc | 2 +- .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/application-code.png | Bin .../images/genmodel.png | Bin .../images/gui.png | Bin .../images/statechart.png | Bin .../images/traffic_light_thumb.jpg | Bin .../index.html | 0 .../metadata.json | 4 +- .../model/TrafficLightCtrl.sgen | 2 +- .../model/TrafficLightCtrl.ysc | 2 +- .../resources/images/TrafficLightCtrl.png | Bin .../resources/images/counter.jpg | Bin .../resources/images/counter_empty.png | Bin .../resources/images/counter_empty.svg | 0 .../resources/images/green_light.png | Bin .../resources/images/green_light.xcf | Bin .../resources/images/horizontal_bar.png | Bin .../resources/images/horizontal_bar.svg | 0 .../resources/images/horizontal_bar_green.png | Bin .../resources/images/horizontal_bar_green.svg | 0 .../resources/images/red_light.png | Bin .../resources/images/red_light.xcf | Bin .../resources/images/trafficlight.jpg | Bin .../resources/images/trafficlight_empty.jpg | Bin .../resources/images/trafficlight_green.jpg | Bin .../resources/images/trafficlight_red.jpg | Bin .../resources/images/trafficlight_yellow.jpg | Bin .../resources/images/vertical_bar.png | Bin .../resources/images/vertical_bar.svg | 0 .../resources/images/vertical_bar_green.png | Bin .../resources/images/vertical_bar_green.svg | 0 .../resources/images/yellow_light.png | Bin .../resources/images/yellow_light.xcf | Bin .../com/yakindu/core/IEventDriven.java | 13 + .../com/yakindu/core/IStatemachine.java | 4 +- .../src-gen/com/yakindu/core/ITimed.java | 2 +- .../com/yakindu/core/ITimerService.java | 2 +- .../com/yakindu/core/TimerService.java | 110 + .../com/yakindu/core/VirtualTimer.java | 75 +- .../com/yakindu/core/rx/Observable.java | 24 + .../src-gen/com/yakindu/core/rx/Observer.java | 8 + .../traffic/light/TrafficLightCtrl.java | 1455 + .../src/traffic/light/TrafficlightDemo.java | 0 .../src/traffic/light/ui/ButtonPanel.java | 4 +- .../src/traffic/light/ui/Counter.java | 4 +- .../src/traffic/light/ui/CrossWalkPanel.java | 0 .../src/traffic/light/ui/TrafficLight.java | 4 +- .../traffic/light/ui/TrafficLightFrame.java | 0 .../.project | 2 +- .../css/style.css | 0 .../multi_state_machine_example_overview.png | Bin .../images/traffic_light_thumb.jpg | Bin .../index.html | 0 .../metadata.json | 2 +- .../model/ReleaseProcess.ysc | 2 +- .../model/StreetCrossingSystem.ysc | 2 +- .../model/TrafficLight.ysc | 2 +- .../model/TwoWayTrafficControl.ysc | 2 +- .../model/TwoWayTrafficControl2.ysc | 2 +- .../tests/TwoWayTrafficControl.sctunit | 0 .../.gitignore | 0 .../.project | 2 +- .../.pydevproject | 0 .../css/style.css | 0 .../images/TrafficLightCtrl.png | Bin .../images/rpi_circuit.svg | 6 +- .../images/traffic_light_python_rasp.jpg | Bin .../index.html | 0 .../metadata.json | 4 +- .../model/TrafficLightCtrl.sgen | 2 +- .../model/TrafficLightCtrl.ysc | 2 +- .../src/main.py | 0 .../src/traffic_light_ctrl.py | 1099 + .../src/trafficscene.py | 0 .../src/trafficscene2.py | 0 .../src/yakindu}/__init__.py | 1 - .../src/yakindu/timer/__init__.py | 5 + .../src/yakindu/timer/timer_service.py | 94 + .../.gitignore | 0 .../.project | 2 +- .../.pydevproject | 0 .../css/style.css | 0 .../images/TrafficLightCtrl.png | Bin .../images/trafficLightGui.png | Bin .../images/traffic_light_python.jpg | Bin .../index.html | 0 .../metadata.json | 2 +- .../model/TrafficLightCtrl.sgen | 2 +- .../model/TrafficLightCtrl.ysc | 2 +- .../src/main.py | 0 .../src/traffic_light_ctrl.py | 1099 + .../src/traffic_scene.py | 0 .../src/yakindu/__init__.py | 5 + .../src/yakindu/timer/__init__.py | 5 + .../src/yakindu/timer/timer_service.py | 94 + .../.classpath | 0 .../.gitignore | 0 .../.project | 2 +- .../css/style.css | 0 .../images/trafficlight.png | Bin .../images/trafficlight_example.png | Bin .../index.html | 8 +- .../metadata.json | 4 +- .../model/TrafficLightStateMachine.sgen | 4 +- .../model/TrafficLightStateMachine.ysc | 2 +- .../src/Button.qml | 0 .../src/Lights.ui.qml | 0 .../src/TrafficLight.qml | 0 .../src/background.png | Bin .../src/green.png | Bin .../src/pause.png | Bin .../src/play.png | Bin .../src/red.png | Bin .../src/trafficlight-main.cpp | 0 .../src/trafficlight-project.pro | 2 +- .../src/trafficlight-project.qrc | 0 .../src/trafficlight.cpp | 0 .../src/trafficlight.h | 0 .../src/yellow.png | Bin .../tests/QtSCXMLTests.sgen | 4 +- .../tests/TestSuite.sctunit | 0 .../TrafficLightStateMachineTests.sctunit | 0 .../.cproject | 43 + .../.gitignore | 0 .../.project | 2 +- .../Zowi/BatReader.cpp | 0 .../Zowi/BatReader.h | 0 .../Zowi/EnableInterrupt.h | 0 .../Zowi/LedMatrix.cpp | 0 .../Zowi/LedMatrix.h | 0 .../Zowi/Oscillator.cpp | 0 .../Zowi/Oscillator.h | 0 .../Zowi/README.md | 0 .../Zowi/README.txt | 0 .../Zowi/US.cpp | 0 .../Zowi/US.h | 0 .../Zowi/Zowi.cpp | 0 .../Zowi/Zowi.h | 0 .../Zowi/ZowiPinOut.h | 0 .../Zowi/ZowiSerialCommand.cpp | 0 .../Zowi/ZowiSerialCommand.h | 0 .../Zowi/Zowi_gestures.h | 0 .../Zowi/Zowi_mouths.h | 0 .../Zowi/Zowi_sounds.h | 0 .../Zowi/keywords.txt | 0 .../css/style.css | 0 .../images/Build.PNG | Bin .../images/IsSomeOneHere_1.png | Bin .../images/Launch_Configuration.PNG | Bin .../images/ObstacleDetected_2.png | Bin .../images/Run.PNG | Bin .../images/Zowi.jpg | Bin .../images/ZowiLibraries.png | Bin .../images/ZowiSCT_0.png | Bin .../index.html | 0 .../main.ino | 0 .../metadata.json | 2 +- .../model/ZowiSCT.ysc | 6 +- .../model/zowiSCT.sgen | 0 .../.project | 17 - .../.project | 17 - .../.project | 17 - .../model/01_basic/01.sgen | 16 - .../model/02_dimmer/02.sgen | 16 - .../model/05_presencesimulation/05.sgen | 16 - .../src/main.py | 60 - .../.ccsproject | 16 - .../.cproject | 181 - .../.gitignore | 5 - .../.launches/msp430_sct_blink.launch | 17 - .../BlinkyStateMachine.sgen | 15 - .../blinkyStateMachine.ysc | 146 - .../images/AddNeon.png | Bin 18946 -> 0 bytes .../images/DownloadOptions.png | Bin 6044 -> 0 bytes .../images/Operations.png | Bin 2547 -> 0 bytes .../images/ShortcutPath.png | Bin 43811 -> 0 bytes .../images/StateMachineCommunity.png | Bin 19461 -> 0 bytes .../images/StatechartTrans.png | Bin 13957 -> 0 bytes .../images/addStatechart.png | Bin 12114 -> 0 bytes .../images/blinkyStateMachine.png | Bin 14517 -> 0 bytes .../images/c99.png | Bin 31141 -> 0 bytes .../images/installNewSoftware.png | Bin 17874 -> 0 bytes .../images/installSCT.png | Bin 21112 -> 0 bytes .../images/msp430.jpg | Bin 94451 -> 0 bytes .../images/msp430_thumb.jpg | Bin 27129 -> 0 bytes .../images/projectView.png | Bin 43272 -> 0 bytes .../images/sgen.png | Bin 10670 -> 0 bytes .../index.html | 207 - .../lnk_msp430g2553.cmd | 146 - org.yakindu.sct.examples.msp430.blinky/main.c | 69 - .../metadata.json | 11 - .../targetConfigs/MSP430G2553.ccxml | 12 - .../targetConfigs/readme.txt | 9 - .../lib/mockito-all-2.0.2-beta.jar | Bin 1234720 -> 0 bytes .../src-gen/light/tests/LightSwitchTest.java | 191 - .../.tictoc.sctunit.xml | 5 - .../machine/TrafficLightStateMachine.cpp | 768 - .../machine/TrafficLightStateMachine.h | 260 - .../machine/sc_qt_timerservice.cpp | 115 - .../machine/sc_qt_timerservice.h | 69 - .../implementation/machine/sc_rxcpp.h | 142 - .../implementation/machine/sc_statemachine.h | 39 - .../implementation/machine/sc_timer.h | 70 - .../implementation/machine/sc_types.h | 37 - .../css/style.css | 702 - .../.cproject | 76 - .../.gitignore | 4 - .../.project | 61 - .../Zowi/BatReader.cpp | 31 - .../Zowi/BatReader.h | 71 - .../Zowi/EnableInterrupt.h | 1517 - .../Zowi/LedMatrix.cpp | 88 - .../Zowi/LedMatrix.h | 93 - .../Zowi/Oscillator.cpp | 126 - .../Zowi/Oscillator.h | 68 - .../Zowi/README.md | 324 - .../Zowi/README.txt | 0 .../Zowi/US.cpp | 38 - .../Zowi/US.h | 20 - .../Zowi/Zowi.cpp | 1162 - .../Zowi/Zowi.h | 124 - .../Zowi/ZowiPinOut.h | 33 - .../Zowi/ZowiSerialCommand.cpp | 119 - .../Zowi/ZowiSerialCommand.h | 58 - .../Zowi/Zowi_gestures.h | 70 - .../Zowi/Zowi_mouths.h | 87 - .../Zowi/Zowi_sounds.h | 133 - .../Zowi/keywords.txt | 5 - .../css/style.css | 702 - .../images/Build.PNG | Bin 3097 -> 0 bytes .../images/IsSomeOneHere_1.png | Bin 14629 -> 0 bytes .../images/Launch_Configuration.PNG | Bin 25752 -> 0 bytes .../images/ObstacleDetected_2.png | Bin 19497 -> 0 bytes .../images/Run.PNG | Bin 3436 -> 0 bytes .../images/Zowi.jpg | Bin 1628776 -> 0 bytes .../images/ZowiLibraries.png | Bin 99310 -> 0 bytes .../images/ZowiSCT_0.png | Bin 102486 -> 0 bytes .../index.html | 69 - .../main.ino | 28 - .../metadata.json | 16 - .../model/ZowiSCT.ysc | 560 - .../model/zowiSCT.sgen | 14 - .../src/ZowiCallbacks.cpp | 50 - .../src/ZowiCallbacks.h | 28 - 1055 files changed, 187191 insertions(+), 190552 deletions(-) delete mode 100644 com.yakindu.sct.examples.blinky.cpp.arduino/.cproject delete mode 100644 com.yakindu.sct.examples.codegen.multism.cpp/src-gen/.gitignore delete mode 100644 com.yakindu.sct.examples.codegen.multism.python/src/main.py delete mode 100644 com.yakindu.sct.examples.msp430.blinky/.cproject delete mode 100644 com.yakindu.sct.examples.msp430.blinky/.project delete mode 100644 com.yakindu.sct.examples.stm32f407vg.blinky/.cproject delete mode 100644 com.yakindu.sct.examples.stm32f407vg.multism.blinky/.cproject delete mode 100644 com.yakindu.sct.examples.trafficlight.multism/.project delete mode 100644 com.yakindu.sct.examples.zowi.cpp.arduino/.cproject create mode 100644 itemis.create.examples.basic.childfirst/.project rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.childfirst}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/images/childfirst.png (100%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.childfirst}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/images/model.png (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/images/parentfirst.png (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/index.html (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/metadata.json (86%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/models/childfirst.ysc (99%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.childfirst}/models/parentfirst.ysc (99%) rename {org.yakindu.sct.examples.basic.digital_watch => itemis.create.examples.basic.digital_watch}/.project (89%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.eventbuffers}/.project (86%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/EventBuffersDisabled.ysc (99%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/EventBuffersEnabled.ysc (99%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.basic.eventbuffers}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/images/EventBuffersEnabled1.png (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/images/EventBuffersEnabled2.png (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/images/EventBuffersEnabled3.png (100%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.basic.eventbuffers}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/index.html (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventbuffers}/metadata.json (84%) create mode 100644 itemis.create.examples.basic.eventdriven/.project rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.basic.eventdriven}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/images/cyclebased.png (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/images/eventdriven.png (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.basic.eventdriven}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/images/model.png (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/index.html (91%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/metadata.json (86%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/models/cyclebased.ysc (99%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.eventdriven}/models/eventdriven.ysc (99%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.hierarchical}/.project (86%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.basic.hierarchical}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/images/01_no_hierarchy.png (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/images/02_composite_states.png (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/images/03_nested_composite_states.png (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/images/04_subdiagrams.png (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.hierarchical}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/index.html (95%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/metadata.json (85%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/models/01_no_hierarchy.ysc (99%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/models/02_composite_states.ysc (99%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/models/03_nested_composite_states.ysc (99%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.hierarchical}/models/04_subdiagrams.ysc (98%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/.gitignore (100%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.basic.historystates}/.project (86%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.basic.historystates}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/images/change_entry_kind.png (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/images/deep_history.png (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.basic.historystates}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/images/no_history.png (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/images/shallow_history.png (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/index.html (95%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/metadata.json (84%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/models/01_no_history.ysc (99%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/models/02_shallow_history.ysc (99%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.historystates}/models/03_deep_history.ysc (99%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/.project (87%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.basic.multism}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.basic.multism}/images/lights_thumb.jpg (100%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/images/multism.gif (100%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/index.html (100%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/metadata.json (82%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/model/controller.ysc (98%) rename {com.yakindu.sct.examples.basic.multism => itemis.create.examples.basic.multism}/model/led.ysc (98%) create mode 100644 itemis.create.examples.basic.orthogonality/.project rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.basic.orthogonality}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/images/event-raising.png (100%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/images/keyboard.png (100%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/images/orthogonality.png (100%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/index.html (86%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/metadata.json (84%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/model/keyboard.ysc (99%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.basic.orthogonality}/model/orthogonality.ysc (99%) create mode 100644 itemis.create.examples.basic.supersteps/.project rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.basic.supersteps}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/images/SuperSteps1.png (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/images/SuperSteps2.png (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/images/SuperStepsSimple.png (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/index.html (100%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/metadata.json (84%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/models/SuperStepsDisabled.ysc (99%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.basic.supersteps}/models/SuperStepsEnabled.ysc (99%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/.classpath (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/.gitignore (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.basic.tutorial}/.project (93%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.basic.tutorial}/css/style.css (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/css/ypi.css (97%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/01_light_switch.png (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/02_light_switch.png (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/03_light_switch.png (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/04_light_switch.png (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/05_light_switch.png (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/lights.jpg (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/images/lights_thumb.jpg (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/index.html (93%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/metadata.json (54%) create mode 100644 itemis.create.examples.basic.tutorial/model/01_basic/01.sgen rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/01_basic/01_LightSwitch.ysc (98%) create mode 100644 itemis.create.examples.basic.tutorial/model/02_dimmer/02.sgen rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/02_dimmer/02_DimmableLightSwitch.ysc (98%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/03_motionsense/03.sgen (51%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/03_motionsense/03_MotionLightSwitch.ysc (99%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc (99%) create mode 100644 itemis.create.examples.basic.tutorial/model/05_presencesimulation/05.sgen rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc (99%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.basic.tutorial}/src-gen/.gitignore (100%) create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/IEventDriven.java create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/IStatemachine.java create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/ITimed.java create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/ITimerService.java create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/TimerService.java create mode 100644 itemis.create.examples.basic.tutorial/src/itemis/create/VirtualTimer.java rename {org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct => itemis.create.examples.basic.tutorial/src/itemis/create}/examples/lightswitch/LightSwitch_01.java (79%) rename {org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct => itemis.create.examples.basic.tutorial/src/itemis/create}/examples/lightswitch/LightSwitch_02.java (87%) rename {org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct => itemis.create.examples.basic.tutorial/src/itemis/create}/examples/lightswitch/LightSwitch_03.java (90%) rename {org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct => itemis.create.examples.basic.tutorial/src/itemis/create}/examples/lightswitch/LightSwitch_05.java (89%) create mode 100644 itemis.create.examples.blinky.cpp.arduino/.cproject rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/.gitignore (100%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/.project (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.blinky.cpp.arduino}/css/style.css (100%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/images/arduino.jpg (100%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/index.html (97%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/main.ino (100%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/metadata.json (89%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/model/Arduino_Blinky_SCT.sgen (60%) rename {com.yakindu.sct.examples.blinky.cpp.arduino => itemis.create.examples.blinky.cpp.arduino}/model/Arduino_Blinky_SCT.ysc (98%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/.cproject (98%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/.gitignore (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/.project (94%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.codegen.c}/css/style.css (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/images/console.png (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/images/content-assist.gif (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/images/model.png (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.c}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/index.html (90%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/metadata.json (84%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/models/c.sgen (80%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.c}/src/main.c (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/.cproject (94%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/.gitignore (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.codegen.cpp}/.project (95%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.codegen.cpp}/css/style.css (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/images/console.png (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/images/content-assist.gif (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/images/model.png (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.cpp}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/index.html (93%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/metadata.json (83%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/models/cpp.sgen (79%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.cpp}/src/main.cpp (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.java}/.classpath (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.java}/.gitignore (100%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.codegen.java}/.project (92%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.codegen.java}/css/style.css (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/images/console.png (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/images/content-assist.gif (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/images/model.png (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.java}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/index.html (91%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/metadata.json (83%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/models/java.sgen (72%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.java}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.codegen.java/src/org/yakindu/sct => itemis.create.examples.codegen.java/src/itemis/create}/examples/codegen/java/Main.java (93%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/.cproject (76%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/.gitignore (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.codegen.multism.c}/.project (94%) rename {org.yakindu.sct.examples.basic.childfirst => itemis.create.examples.codegen.multism.c}/css/style.css (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/images/console.png (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/images/light.png (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/images/light_controller_defsection.png (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/images/light_controller_machine.png (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.c}/images/watch_gears_thumb.jpg (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/index.html (94%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/metadata.json (84%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/models/c.sgen (74%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.c}/models/light.ysc (98%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.c}/models/light_controller.ysc (99%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.c}/src/main.c (98%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/.cproject (75%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/.gitignore (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.codegen.multism.cpp}/.project (95%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.codegen.multism.cpp}/css/style.css (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/images/console.png (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/images/light.png (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/images/light_controller_defsection.png (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/images/light_controller_machine.png (100%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.codegen.multism.cpp}/images/watch_gears_thumb.jpg (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/index.html (96%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/metadata.json (84%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/models/cpp.sgen (73%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.cpp}/models/light.ysc (98%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.cpp}/models/light_controller.ysc (99%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.codegen.multism.cpp}/src/main.cpp (96%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.multism.java}/.classpath (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.multism.java}/.gitignore (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/.project (92%) rename {org.yakindu.sct.examples.basic.eventdriven => itemis.create.examples.codegen.multism.java}/css/style.css (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/images/console.png (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/images/light.png (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/images/light_controller_defsection.png (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/images/light_controller_machine.png (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.codegen.multism.java}/images/watch_gears_thumb.jpg (100%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/index.html (95%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/metadata.json (84%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.java}/models/java.sgen (61%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.java}/models/light.ysc (98%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.java}/models/light_controller.ysc (99%) rename {com.yakindu.sct.examples.codegen.multism.java/src/com/yakindu/sct => itemis.create.examples.codegen.multism.java/src/itemis/create}/examples/codegen/multism/java/Main.java (88%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/.gitignore (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/.project (89%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/.pydevproject (100%) rename {org.yakindu.sct.examples.basic.hierarchical => itemis.create.examples.codegen.multism.python}/css/style.css (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/images/console.png (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/images/light.png (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/images/light_controller_defsection.png (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/images/light_controller_machine.png (100%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.codegen.multism.python}/images/watch_gears_thumb.jpg (100%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/index.html (96%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/metadata.json (88%) rename {com.yakindu.sct.examples.codegen.multism.java => itemis.create.examples.codegen.multism.python}/models/light.ysc (98%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.codegen.multism.python}/models/light_controller.ysc (99%) rename {com.yakindu.sct.examples.codegen.multism.python => itemis.create.examples.codegen.multism.python}/models/python.sgen (77%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/.gitignore (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/.project (90%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/.pydevproject (100%) rename {org.yakindu.sct.examples.basic.historystates => itemis.create.examples.codegen.python}/css/style.css (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/images/console.png (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/images/content-assist.gif (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/images/model.png (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/index.html (92%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/metadata.json (88%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.codegen.python}/models/python.sgen (78%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/.project (87%) rename {org.yakindu.sct.examples.basic.orthogonality => itemis.create.examples.codegen.scxml}/css/style.css (100%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/images/content-assist.gif (100%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/images/model.png (100%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/index.html (92%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/metadata.json (83%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.codegen.scxml}/models/scxml.sgen (71%) create mode 100644 itemis.create.examples.codegen.scxml/src-gen/LightSwitch.scxml rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/.cproject (87%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/.gitignore (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/.project (95%) rename {org.yakindu.sct.examples.basic.supersteps => itemis.create.examples.coffeemachine.c}/css/style.css (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/images/CodeCompletion.png (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/images/CoffeeMachine_model.png (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/images/coffee_machine.jpg (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/images/coffee_machine_thumb.jpg (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/images/console.png (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/index.html (96%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/main.c (99%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/metadata.json (70%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/model/CoffeeMachine.sgen (71%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/model/CoffeeMachine.ysc (98%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/cm_hmi.c (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/cm_hmi.h (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/cm_trace.c (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/cm_trace.h (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/coffee_machine.c (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/src/coffee_machine.h (100%) rename {com.yakindu.sct.examples.coffeemachine.c => itemis.create.examples.coffeemachine.c}/tests/CoffeeMachineTest.sctunit (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/.cproject (77%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/.gitignore (100%) rename {com.yakindu.sct.examples.codegen.multism.cpp => itemis.create.examples.coffeemachine.cpp}/.project (95%) rename {org.yakindu.sct.examples.basic.tutorial => itemis.create.examples.coffeemachine.cpp}/css/style.css (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/images/CoffeeMachineCpp_0.png (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/images/coffee_machine.jpg (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/images/coffee_machine_thumb.jpg (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/images/functions.png (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/images/simulationview.png (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/index.html (96%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/main.cpp (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/metadata.json (81%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/model/CoffeeMachineCpp.sgen (68%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/model/CoffeeMachineCpp.ysc (98%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CMHMI.cpp (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CMHMI.hpp (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CMTracing.cpp (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CMTracing.h (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CoffeeMachine.cpp (100%) rename {com.yakindu.sct.examples.coffeemachine.cpp => itemis.create.examples.coffeemachine.cpp}/src/CoffeeMachine.hpp (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/.cproject (90%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/.gitignore (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/.project (96%) rename {org.yakindu.sct.examples.codegen.c => itemis.create.examples.digitalwatch.cpp.arduino}/css/style.css (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/images/DigitalWatch.jpg (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/images/digital_watch_thumb.jpg (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/index.html (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/main.ino (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/metadata.json (88%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/model/DigitalWatch.sgen (57%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/model/DigitalWatch.ysc (99%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/src/DisplayHandler.cpp (100%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.digitalwatch.cpp.arduino}/src/DisplayHandler.h (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/.classpath (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/.gitignore (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/.project (91%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.digitalwatch}/css/style.css (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/digital_watch.jpg (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/digital_watch_thumb.jpg (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/subdiagram.png (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/watch.png (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/watch_declaration.png (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/images/watch_subdiagrams.png (100%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/index.html (96%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/metadata.json (92%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/model/watch.ysc (99%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.digitalwatch}/model/watch_subdiagrams.ysc (99%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/.gitignore (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.elevator}/.project (88%) rename {org.yakindu.sct.examples.codegen.java => itemis.create.examples.elevator}/css/style.css (100%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/images/elevator.jpg (100%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/index.html (88%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/metadata.json (85%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/model/Elevator.ysc (99%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.elevator}/test/elevator.sctunit (96%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/.cproject (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/.gitignore (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/.project (92%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/CMakeLists.txt (79%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/Makefile (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/images/blinky.png (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/images/runas.png (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/images/wifi_settings.png (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/images/yet_target_trace_debugging.png (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/index.html (92%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/CMakeLists.txt (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/Kconfig.projbuild (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/component.mk (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/hmi.c (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/hmi.h (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/main.c (99%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/sc/util/yet_logger.c (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/sc/util/yet_logger.h (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/sc/util/yet_udp_stream.c (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/main/sc/util/yet_udp_stream.h (100%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/metadata.json (79%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/model/blink.ysc (99%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/model/sm.sgen (74%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/model/yet.sgen (54%) rename {org.yakindu.sct.examples.esp32.tracing => itemis.create.examples.esp32.tracing}/sdkconfig (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/.cproject (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/.gitignore (100%) rename {com.yakindu.sct.examples.codegen.multism.c => itemis.create.examples.fmu.bouncingball}/.project (94%) rename {org.yakindu.sct.examples.codegen.python => itemis.create.examples.fmu.bouncingball}/css/style.css (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/images/model.png (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/images/results.png (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/index.html (88%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/metadata.json (88%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/models/BouncingBall.sgen (62%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.fmu.bouncingball}/models/BouncingBall.ysc (98%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/.cproject (91%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/.gitignore (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/.project (96%) rename {org.yakindu.sct.examples.codegen.scxml => itemis.create.examples.hmi.cpp.arduino}/css/style.css (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/ArduinoHMI.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/ArduinoHMISimple.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/Counter.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/HMI_LCD.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/HandleStates.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/StopWatch.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/images/defnitionSection.jpeg (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/index.html (97%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/main.ino (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/metadata.json (90%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/model/ArduinoHMI.sgen (59%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/model/ArduinoHMI.ysc (99%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/src/DisplayHandler.cpp (100%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.hmi.cpp.arduino}/src/DisplayHandler.h (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/.cproject (85%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.integration.c.arduino.interrupts}/.gitignore (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/.project (96%) rename {org.yakindu.sct.examples.digitalwatch.cpp.arduino => itemis.create.examples.integration.c.arduino.interrupts}/css/style.css (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/images/embedded_system.jpg (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/images/platform_integration_example.jpeg (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/index.html (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/main.ino (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/metadata.json (86%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.interrupts}/model/CodeGenerator.sgen (60%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.interrupts}/model/StateMachine.ysc (98%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/src/hw_impl.c (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/src/hw_impl.h (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/src/timer_impl.c (100%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.interrupts}/src/timer_impl.h (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/.cproject (81%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.polling}/.gitignore (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/.project (96%) rename {org.yakindu.sct.examples.digitalwatch => itemis.create.examples.integration.c.arduino.polling}/css/style.css (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/images/embedded_system.jpg (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/images/platform_integration_example.jpeg (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/index.html (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/main.ino (100%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/metadata.json (86%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.polling}/model/CodeGenerator.sgen (59%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.integration.c.arduino.polling}/model/StateMachine.ysc (98%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/src/hw_impl.c (96%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/src/hw_impl.h (96%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/src/timer_impl.c (96%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.integration.c.arduino.polling}/src/timer_impl.h (95%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/.cproject (92%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.lightctrl.c.arduino}/.gitignore (100%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/.project (96%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.lightctrl.c.arduino}/css/style.css (100%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/images/YAKINDU-Statecharts-Arduino_thumb.jpg (100%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/index.html (97%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/main.ino (100%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/metadata.json (56%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/model/LightCtrl.sgen (58%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.lightctrl.c.arduino}/model/LightCtrl.ysc (98%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/.ccsproject (100%) create mode 100644 itemis.create.examples.msp430.blinky/.cproject rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/.gitignore (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/.launches/msp430_sct_plugin_blink.launch (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/.launches/msp430_sctpro_blink.launch (100%) rename {org.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/.project (95%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/blinkyStateMachine.sgen (66%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/blinkyStateMachine.ysc (98%) rename {org.yakindu.sct.examples.fmu.bouncingball => itemis.create.examples.msp430.blinky}/css/style.css (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/AddNeon.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/DownloadOptions.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/ShortcutPath.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/addStatechart.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/blinkyStateMachine.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/c99.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/emptySCT.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/installNewSoftware.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/installSCT.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/msp430.jpg (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/msp430_thumb.jpg (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/proSCT.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/projectView.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/sgen.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/images/stateSCT.png (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/index.html (92%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/lnk_msp430g2553.cmd (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/main.c (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/metadata.json (68%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/msp430g2553.h (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/targetConfigs/MSP430G2553.ccxml (100%) rename {com.yakindu.sct.examples.msp430.blinky => itemis.create.examples.msp430.blinky}/targetConfigs/readme.txt (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/.cproject (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/.gitignore (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/.project (94%) rename {org.yakindu.sct.examples.hmi.cpp.arduino => itemis.create.examples.raspberry.helloworld}/css/style.css (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/images/header.jpg (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/images/sct.png (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/index.html (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/metadata.json (87%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/rgb.sgen (52%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/rgb.ysc (99%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/scutil/sc_cycle_runner.c (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/scutil/sc_cycle_runner.h (93%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/src/gpio_util.c (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/src/gpio_util.h (100%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.raspberry.helloworld}/src/main.c (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/.cproject (94%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/.gitignore (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.c}/.project (94%) rename {org.yakindu.sct.examples.integration.c.arduino.interrupts => itemis.create.examples.sctunit.c}/css/style.css (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/images/linker_libraries.png (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/images/model.png (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/images/testoutput.png (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/index.html (76%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/metadata.json (85%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/models/c.sgen (80%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/tests/c_test.sgen (71%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.sctunit.c}/tests/light_switch_test.sctunit (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/.cproject (94%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/.gitignore (100%) rename {org.yakindu.sct.examples.codegen.cpp => itemis.create.examples.sctunit.cpp}/.project (94%) rename {org.yakindu.sct.examples.integration.c.arduino.polling => itemis.create.examples.sctunit.cpp}/css/style.css (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/images/linker_libraries.png (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/images/model.png (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/images/testoutput.png (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/index.html (76%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/metadata.json (85%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/models/cpp.sgen (80%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/tests/cpp_test.sgen (71%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.sctunit.cpp}/tests/light_switch_test.sctunit (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/.classpath (60%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/.gitignore (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/.project (91%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.sctunit.java}/css/style.css (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/images/build_path.png (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/images/model.png (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/images/testoutput.png (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/index.html (70%) create mode 100644 itemis.create.examples.sctunit.java/lib/byte-buddy-1.12.19.jar create mode 100644 itemis.create.examples.sctunit.java/lib/byte-buddy-agent-1.12.19.jar create mode 100644 itemis.create.examples.sctunit.java/lib/mockito-core-4.10.0.jar create mode 100644 itemis.create.examples.sctunit.java/lib/objenesis-3.3.jar rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/metadata.json (85%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/models/java.sgen (81%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/tests/java_test.sgen (79%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.sctunit.java}/tests/light_switch_test.sctunit (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/.gitignore (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/.project (90%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/.pydevproject (100%) rename {org.yakindu.sct.examples.msp430.blinky => itemis.create.examples.sctunit.python}/css/style.css (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/images/model.png (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/images/testoutput.png (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/index.html (63%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/metadata.json (84%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/models/python.sgen (78%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/tests/light_switch_test.sctunit (100%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.sctunit.python}/tests/python_test.sgen (69%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/.gitignore (100%) rename {org.yakindu.sct.examples.elevator => itemis.create.examples.sctunit}/.project (88%) rename {org.yakindu.sct.examples.raspberry.helloworld => itemis.create.examples.sctunit}/css/style.css (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/images/coverage_model_1.png (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/images/coverage_report_1.png (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/images/model.png (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/images/watch_gears_thumb.jpg (100%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/index.html (91%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/metadata.json (86%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/models/light_switch.ysc (98%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.sctunit}/tests/light_switch_test.sctunit (100%) create mode 100644 itemis.create.examples.stm32f407vg.blinky/.cproject rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/.gitignore (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/.project (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Inc/main.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Inc/sc_timer_service.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Inc/stm32f4xx_hal_conf.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Inc/stm32f4xx_it.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/main.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/sc_timer_service.c (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/stm32f4xx_hal_msp.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/stm32f4xx_it.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/syscalls.c (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/sysmem.c (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Src/system_stm32f4xx.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Core/Startup/startup_stm32f407vgtx.s (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_armcc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_armclang.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_compiler.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_gcc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_iccarm.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/cmsis_version.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_armv8mbl.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_armv8mml.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm0.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm0plus.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm1.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm23.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm3.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm33.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm4.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_cm7.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_sc000.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/core_sc300.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/mpu_armv7.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/mpu_armv8.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/CMSIS/Include/tz_context.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/STM32F407VGTX_FLASH.ld (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/STM32F407VGTX_RAM.ld (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/com.yakindu.sct.examples.stm32f407vg.blinky.ioc (96%) rename {org.yakindu.sct.examples.sctunit.c => itemis.create.examples.stm32f407vg.blinky}/css/style.css (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/images/stm.png (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/images/stm_configuration.png (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/images/stm_preview.jpg (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/index.html (93%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/metadata.json (85%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/model/blinky.ysc (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.blinky}/model/generator.sgen (60%) create mode 100644 itemis.create.examples.stm32f407vg.multism.blinky/.cproject rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/.gitignore (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/.project (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Inc/main.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Inc/sc_timer_service.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Inc/stm32f4xx_hal_conf.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Inc/stm32f4xx_it.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/main.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/sc_timer_service.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/stm32f4xx_hal_msp.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/stm32f4xx_it.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/syscalls.c (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/sysmem.c (100%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Src/system_stm32f4xx.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Core/Startup/startup_stm32f407vgtx.s (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_armcc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_armclang.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_compiler.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_gcc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_iccarm.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/cmsis_version.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_armv8mbl.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_armv8mml.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm0.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm0plus.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm1.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm23.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm3.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm33.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm4.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_cm7.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_sc000.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/core_sc300.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/mpu_armv7.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/mpu_armv8.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/CMSIS/Include/tz_context.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h (98%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c (96%) rename {com.yakindu.sct.examples.stm32f407vg.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c (97%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/STM32F407VGTX_FLASH.ld (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/STM32F407VGTX_RAM.ld (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc (96%) rename {org.yakindu.sct.examples.sctunit.cpp => itemis.create.examples.stm32f407vg.multism.blinky}/css/style.css (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/images/stm.png (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/images/stm2.png (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/images/stm_configuration.png (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/images/stm_preview.jpg (100%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/index.html (93%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/metadata.json (85%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/model/LED.ysc (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/model/controller.ysc (98%) rename {com.yakindu.sct.examples.stm32f407vg.multism.blinky => itemis.create.examples.stm32f407vg.multism.blinky}/model/generator.sgen (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/.cproject (95%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/.gitignore (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/.project (86%) create mode 100644 itemis.create.examples.tictoc.tracing/.tictoc.sctunit.xml rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/hmi.c (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/hmi.h (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/images/tictoc_debugging.png (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/images/yet_configure_trace_debugging.png (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/images/yet_launch_trace_debugging.png (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/images/yet_target_trace_debugging.png (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/index.html (95%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/main.c (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/metadata.json (67%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_file.c (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_file.h (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_logger.c (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_logger.h (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_udp_stream.c (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/sc/util/yet_udp_stream.h (100%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/tictoc.sct (99%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/tictoc_sm.sgen (82%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/tictoc_trace.sgen (71%) rename {org.yakindu.sct.examples.tictoc.tracing => itemis.create.examples.tictoc.tracing}/trace.yet (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/.cproject (92%) rename {org.yakindu.sct.examples.lightctrl.c.arduino => itemis.create.examples.trafficlight.c.arduino}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/.project (96%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.trafficlight.c.arduino}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/TrafficLightCtrl.png (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/YAKINDU-Statecharts-Arduino.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/YAKINDU-Statecharts-Arduino_thumb.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/arduino_1.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/arduino_2.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/arduino_buttons.png (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/images/screenshot_installhardware.png (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/index.html (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/metadata.json (83%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/model/TrafficLightCtrl.sgen (72%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.c.arduino}/model/TrafficLightCtrl.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/pushbutton.c (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/pushbutton.h (100%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.c.arduino}/traffic_light_arduino.ino (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/.cproject (92%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.cpp.arduino}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/.project (95%) rename {org.yakindu.sct.examples.sctunit.python => itemis.create.examples.trafficlight.cpp.arduino}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/TrafficLightCtrl.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/YAKINDU-Statecharts-Arduino.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/YAKINDU-Statecharts-Arduino_thumb.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/arduino-traffic-light.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/arduino_1.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/arduino_2.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/arduino_buttons.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/images/screenshot_installhardware.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/index.html (97%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/main.ino (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/metadata.json (91%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/model/TrafficLightCtrl.sgen (71%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.cpp.arduino}/model/TrafficLightCtrl.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/src/PushButton.cpp (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/src/PushButton.h (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/src/TrafficLightOCBs.cpp (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/src/TrafficLightOCBs.h (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.cpp.arduino}/src/arduinoPins.h (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/.cproject (93%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/.project (88%) rename {org.yakindu.sct.examples.sctunit => itemis.create.examples.trafficlight.cpp.qt}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/images/traffic_light.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/images/trafficlights.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/images/trafficlights_sc.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/background.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/green.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/pause.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/play.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/red.png (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/images/yellow.png (100%) create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.cpp create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_cyclebased.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_eventdriven.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.cpp create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_rxcpp.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_statemachine.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_timer.h create mode 100644 itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_types.h rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/main.cpp (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/main.qml (97%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/qml.qrc (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/implementation/trafficlight-qt-cpp.pro (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/index.html (93%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/metadata.json (60%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/model/TrafficLightStateMachine.sgen (90%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.cpp.qt}/model/TrafficLightStateMachine.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/.classpath (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/.project (92%) rename {org.yakindu.sct.examples.trafficlight.c.arduino => itemis.create.examples.trafficlight.java}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/images/application-code.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/images/genmodel.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/images/gui.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/images/statechart.png (100%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.java}/images/traffic_light_thumb.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/index.html (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/metadata.json (69%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/model/TrafficLightCtrl.sgen (82%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/model/TrafficLightCtrl.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/TrafficLightCtrl.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/counter.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/counter_empty.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/counter_empty.svg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/green_light.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/green_light.xcf (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/horizontal_bar.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/horizontal_bar.svg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/horizontal_bar_green.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/horizontal_bar_green.svg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/red_light.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/red_light.xcf (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/trafficlight.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/trafficlight_empty.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/trafficlight_green.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/trafficlight_red.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/trafficlight_yellow.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/vertical_bar.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/vertical_bar.svg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/vertical_bar_green.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/vertical_bar_green.svg (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/yellow_light.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/resources/images/yellow_light.xcf (100%) create mode 100644 itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IEventDriven.java rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.trafficlight.java}/src-gen/com/yakindu/core/IStatemachine.java (84%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.trafficlight.java}/src-gen/com/yakindu/core/ITimed.java (90%) rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.trafficlight.java}/src-gen/com/yakindu/core/ITimerService.java (93%) create mode 100644 itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/TimerService.java rename {org.yakindu.sct.examples.sctunit.java => itemis.create.examples.trafficlight.java}/src-gen/com/yakindu/core/VirtualTimer.java (67%) create mode 100644 itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observable.java create mode 100644 itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observer.java create mode 100644 itemis.create.examples.trafficlight.java/src-gen/traffic/light/TrafficLightCtrl.java rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/TrafficlightDemo.java (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/ui/ButtonPanel.java (89%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/ui/Counter.java (97%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/ui/CrossWalkPanel.java (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/ui/TrafficLight.java (94%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.java}/src/traffic/light/ui/TrafficLightFrame.java (100%) rename {org.yakindu.sct.examples.basic.eventbuffers => itemis.create.examples.trafficlight.multism}/.project (86%) rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.trafficlight.multism}/css/style.css (100%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/images/multi_state_machine_example_overview.png (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.multism}/images/traffic_light_thumb.jpg (100%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/index.html (100%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/metadata.json (85%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/model/ReleaseProcess.ysc (98%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/model/StreetCrossingSystem.ysc (99%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/model/TrafficLight.ysc (99%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/model/TwoWayTrafficControl.ysc (99%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/model/TwoWayTrafficControl2.ysc (99%) rename {com.yakindu.sct.examples.trafficlight.multism => itemis.create.examples.trafficlight.multism}/tests/TwoWayTrafficControl.sctunit (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/.project (90%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/.pydevproject (100%) rename {org.yakindu.sct.examples.trafficlight.cpp.qt => itemis.create.examples.trafficlight.python.raspberry}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/images/TrafficLightCtrl.png (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/images/rpi_circuit.svg (99%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/images/traffic_light_python_rasp.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/index.html (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/metadata.json (76%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/model/TrafficLightCtrl.sgen (70%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/model/TrafficLightCtrl.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/src/main.py (100%) create mode 100644 itemis.create.examples.trafficlight.python.raspberry/src/traffic_light_ctrl.py rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/src/trafficscene.py (100%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.python.raspberry}/src/trafficscene2.py (100%) rename {org.yakindu.sct.examples.codegen.python/src => itemis.create.examples.trafficlight.python.raspberry/src/yakindu}/__init__.py (98%) create mode 100644 itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/__init__.py create mode 100644 itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/timer_service.py rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/.project (92%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/.pydevproject (100%) rename {org.yakindu.sct.examples.trafficlight.java => itemis.create.examples.trafficlight.python}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/images/TrafficLightCtrl.png (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/images/trafficLightGui.png (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/images/traffic_light_python.jpg (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/index.html (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/metadata.json (89%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/model/TrafficLightCtrl.sgen (73%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/model/TrafficLightCtrl.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/src/main.py (100%) create mode 100644 itemis.create.examples.trafficlight.python/src/traffic_light_ctrl.py rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.trafficlight.python}/src/traffic_scene.py (100%) create mode 100644 itemis.create.examples.trafficlight.python/src/yakindu/__init__.py create mode 100644 itemis.create.examples.trafficlight.python/src/yakindu/timer/__init__.py create mode 100644 itemis.create.examples.trafficlight.python/src/yakindu/timer/timer_service.py rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/.classpath (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/.gitignore (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/.project (89%) rename {org.yakindu.sct.examples.trafficlight.python.raspberry => itemis.create.examples.trafficlight.scxml.qt}/css/style.css (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/images/trafficlight.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/images/trafficlight_example.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/index.html (94%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/metadata.json (79%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/model/TrafficLightStateMachine.sgen (64%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/model/TrafficLightStateMachine.ysc (99%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/Button.qml (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/Lights.ui.qml (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/TrafficLight.qml (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/background.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/green.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/pause.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/play.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/red.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/trafficlight-main.cpp (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/trafficlight-project.pro (83%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/trafficlight-project.qrc (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/trafficlight.cpp (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/trafficlight.h (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/src/yellow.png (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/tests/QtSCXMLTests.sgen (61%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/tests/TestSuite.sctunit (100%) rename {org.yakindu.sct.examples.trafficlight.scxml.qt => itemis.create.examples.trafficlight.scxml.qt}/tests/TrafficLightStateMachineTests.sctunit (100%) create mode 100644 itemis.create.examples.zowi.cpp.arduino/.cproject rename {org.yakindu.sct.examples.trafficlight.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/.gitignore (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/.project (97%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/BatReader.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/BatReader.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/EnableInterrupt.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/LedMatrix.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/LedMatrix.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Oscillator.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Oscillator.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/README.md (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/README.txt (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/US.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/US.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Zowi.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Zowi.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/ZowiPinOut.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/ZowiSerialCommand.cpp (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/ZowiSerialCommand.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Zowi_gestures.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Zowi_mouths.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/Zowi_sounds.h (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/Zowi/keywords.txt (100%) rename {org.yakindu.sct.examples.trafficlight.python => itemis.create.examples.zowi.cpp.arduino}/css/style.css (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/Build.PNG (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/IsSomeOneHere_1.png (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/Launch_Configuration.PNG (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/ObstacleDetected_2.png (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/Run.PNG (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/Zowi.jpg (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/ZowiLibraries.png (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/images/ZowiSCT_0.png (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/index.html (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/main.ino (100%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/metadata.json (89%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/model/ZowiSCT.ysc (99%) rename {com.yakindu.sct.examples.zowi.cpp.arduino => itemis.create.examples.zowi.cpp.arduino}/model/zowiSCT.sgen (100%) delete mode 100644 org.yakindu.sct.examples.basic.hierarchical/.project delete mode 100644 org.yakindu.sct.examples.basic.historystates/.project delete mode 100644 org.yakindu.sct.examples.basic.orthogonality/.project delete mode 100644 org.yakindu.sct.examples.basic.tutorial/model/01_basic/01.sgen delete mode 100644 org.yakindu.sct.examples.basic.tutorial/model/02_dimmer/02.sgen delete mode 100644 org.yakindu.sct.examples.basic.tutorial/model/05_presencesimulation/05.sgen delete mode 100644 org.yakindu.sct.examples.codegen.python/src/main.py delete mode 100644 org.yakindu.sct.examples.msp430.blinky/.ccsproject delete mode 100644 org.yakindu.sct.examples.msp430.blinky/.cproject delete mode 100644 org.yakindu.sct.examples.msp430.blinky/.gitignore delete mode 100644 org.yakindu.sct.examples.msp430.blinky/.launches/msp430_sct_blink.launch delete mode 100644 org.yakindu.sct.examples.msp430.blinky/BlinkyStateMachine.sgen delete mode 100644 org.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.ysc delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/AddNeon.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/DownloadOptions.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/Operations.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/ShortcutPath.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/StateMachineCommunity.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/StatechartTrans.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/addStatechart.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/blinkyStateMachine.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/c99.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/installNewSoftware.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/installSCT.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/msp430.jpg delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/msp430_thumb.jpg delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/projectView.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/images/sgen.png delete mode 100644 org.yakindu.sct.examples.msp430.blinky/index.html delete mode 100644 org.yakindu.sct.examples.msp430.blinky/lnk_msp430g2553.cmd delete mode 100644 org.yakindu.sct.examples.msp430.blinky/main.c delete mode 100644 org.yakindu.sct.examples.msp430.blinky/metadata.json delete mode 100644 org.yakindu.sct.examples.msp430.blinky/targetConfigs/MSP430G2553.ccxml delete mode 100644 org.yakindu.sct.examples.msp430.blinky/targetConfigs/readme.txt delete mode 100644 org.yakindu.sct.examples.sctunit.java/lib/mockito-all-2.0.2-beta.jar delete mode 100644 org.yakindu.sct.examples.sctunit.java/src-gen/light/tests/LightSwitchTest.java delete mode 100644 org.yakindu.sct.examples.tictoc.tracing/.tictoc.sctunit.xml delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.cpp delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.h delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.cpp delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.h delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_rxcpp.h delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_statemachine.h delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_timer.h delete mode 100644 org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/machine/sc_types.h delete mode 100644 org.yakindu.sct.examples.trafficlight.scxml.qt/css/style.css delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/.cproject delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/.gitignore delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/.project delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/BatReader.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/BatReader.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/EnableInterrupt.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/LedMatrix.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/LedMatrix.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Oscillator.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Oscillator.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/README.md delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/README.txt delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/US.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/US.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Zowi.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Zowi.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/ZowiPinOut.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/ZowiSerialCommand.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/ZowiSerialCommand.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Zowi_gestures.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Zowi_mouths.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/Zowi_sounds.h delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/Zowi/keywords.txt delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/css/style.css delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/Build.PNG delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/IsSomeOneHere_1.png delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/Launch_Configuration.PNG delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/ObstacleDetected_2.png delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/Run.PNG delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/Zowi.jpg delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/ZowiLibraries.png delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/images/ZowiSCT_0.png delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/index.html delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/main.ino delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/metadata.json delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/model/ZowiSCT.ysc delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/model/zowiSCT.sgen delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/src/ZowiCallbacks.cpp delete mode 100644 org.yakindu.sct.examples.zowi.cpp.arduino/src/ZowiCallbacks.h diff --git a/.gitignore b/.gitignore index 99fd7b10..bb6e5c50 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ *.settings* */target/* */.gradle/* -org.yakindu.sct.examples.tictoc.tracing/Debug +itemis.create.examples.tictoc.tracing/Debug diff --git a/README.md b/README.md index 0a959d38..c61a3b16 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# Welcome to the YAKINDU Statechart Tools Examples Repository! +# Welcome to the Itemis CREATE Examples Repository! -This repository is hosting examples for [**YAKINDU Statechart Tools**](https://www.itemis.com/en/yakindu/state-machine/). +This repository is hosting examples for [**Itemis CREATE**](https://www.itemis.com/en/yakindu/state-machine/). -With YAKINDU Statechart Tools, you can easily create complex systems in a visual way. Simulate and test your system’s behavior already while you are modeling. Code generators translate your state machine into high-quality source code for different target platforms. +With Itemis CREATE, you can easily create complex systems in a visual way. Simulate and test your system’s behavior already while you are modeling. Code generators translate your state machine into high-quality source code for different target platforms. You can browse [all examples on our website.](https://www.itemis.com/en/yakindu/statechart-tools/documentation/examples/) -Using the **Example Wizard**, which is available in [YAKINDU Statechart Tools since release 2.7](https://www.itemis.com/en/yakindu/statechart-tools/), clones this repository to your local disk and so that you can explore the examples easily. +Using the **Example Wizard**, which is available in [Itemis CREATE since release 2.7](https://www.itemis.com/en/yakindu/statechart-tools/), clones this repository to your local disk and so that you can explore the examples easily. If you think you have a good example as well, feel free to submit is by creating a pull request! Your contributions are very much appreciated! diff --git a/category-pages/labs.html b/category-pages/labs.html index 91d4af98..f006efe8 100644 --- a/category-pages/labs.html +++ b/category-pages/labs.html @@ -4,18 +4,18 @@ - YAKINDU Labs Projects + CREATE Labs Projects -

YAKINDU Labs Projects

+

CREATE Labs Projects

Researching, prototyping, and putting our ideas into code, aside from the day-to-day business, is an essential part of itemis' company culture. -YAKINDU Labs is a collection of projects that are currently in beta phase and therefore not yet released with any YAKINDU product bundles. +CREATE Labs is a collection of projects that are currently in beta phase and therefore not yet released with any CREATE product bundles. As we love early feedback, we regularly blog about what's going on behind the scenes. So try it, and get in touch with us!

-

This repository hosts the following YAKINDU Statechart Tools features: +

This repository hosts the following Itemis CREATE features:

- This example is a good starting point to dive into YAKINDU Statechart Tools headfirst.

+ This example is a good starting point to dive into Itemis CREATE headfirst.

@@ -63,14 +63,14 @@

The First Iteration: States, Transitions and Events

Off.

- The statechart can be simulated in YAKINDU Statechart Tools via right-click -> Run As -> Statechart Simulation. + The statechart can be simulated in Itemis CREATE via right-click -> Run As -> Statechart Simulation.

The Second Iteration: Variables

-

While the classic theory of input/output automata is only aware of events, Harel statecharts and as such YAKINDU statecharts have many more features, including variables. Variables allow to use quantitative values in statecharts and are very comparable to variables in programming languages.

+

While the classic theory of input/output automata is only aware of events, Harel statecharts and as such CREATE statecharts have many more features, including variables. Variables allow to use quantitative values in statecharts and are very comparable to variables in programming languages.

To explain the use of variables we extend the light switch by adding dimming functionality. The light switch supports ten different dimming levels. It still defines the states @@ -160,7 +160,7 @@

The Third Iteration: Composite States

MotionSensing and Manual state are defined for the composite states. This implies that the transitions will be taken independent of the concrete active sub state. So all sub states share the behavior of their parent states.

-

If you want to learn more about composite states, you can check out our Hierarchical tatecharts example or the chapter Composite states in our documentation.

+

If you want to learn more about composite states, you can check out our Hierarchical tatecharts example or the chapter Composite states in our documentation.

The Third Iteration: Composite StatesThe Fourth Iteration: History Entries and Named Interfaces Light Sensing, and vice versa. The deep history state would be activated only if we left the whole Automatic composite state – and when switching between automatic modes this won’t happen.

-

More information on history states can also be found in the History States example or the corresponding chapter in our documentation.

+

More information on history states can also be found in the History States example or the corresponding chapter in our documentation.

@@ -267,7 +267,7 @@

The Fifth Iteration: Orthogonal States, Internal Events and Operations

Waiting raise these internal events.

The definition of - Presence Simulation get quite complex. There are especially a couple of textual rules and expressions which include calculations. Additionally, a modeler may require functions which are not directly available within the statechart. However, YAKINDU SCT allows you to implement your own operations to overcome these limitations. An operation is called from the state machine itself, so you don’t have to care about when and how they will be called. Operations can receive arguments from the state machine and return a value, exactly like a normal function or method call. Operations are declared by the statechart but are not defined within the statechart and must be implemented externally. The presence simulation uses two operations: + Presence Simulation get quite complex. There are especially a couple of textual rules and expressions which include calculations. Additionally, a modeler may require functions which are not directly available within the statechart. However, CREATE SCT allows you to implement your own operations to overcome these limitations. An operation is called from the state machine itself, so you don’t have to care about when and how they will be called. Operations can receive arguments from the state machine and return a value, exactly like a normal function or method call. Operations are declared by the statechart but are not defined within the statechart and must be implemented externally. The presence simulation uses two operations:

  1. get_hour to ask for the current time of day to decide if the presence simulation must be activated.
  2. diff --git a/org.yakindu.sct.examples.basic.tutorial/metadata.json b/itemis.create.examples.basic.tutorial/metadata.json similarity index 54% rename from org.yakindu.sct.examples.basic.tutorial/metadata.json rename to itemis.create.examples.basic.tutorial/metadata.json index 5bc5fbb6..4ad7653e 100644 --- a/org.yakindu.sct.examples.basic.tutorial/metadata.json +++ b/itemis.create.examples.basic.tutorial/metadata.json @@ -1,8 +1,8 @@ { - "id": "org.yakindu.sct.examples.basic.tutorial", + "id": "itemis.create.examples.basic.tutorial", "title": "Basic Tutorial", "author": "itemis AG", - "description": "This is a series of examples demonstrating multiple features of YAKINDU SCT. With each iteration, more features are shown. This example is a good starting point to dive into SCT headfirst.", + "description": "This is a series of examples demonstrating multiple features of CREATE SCT. With each iteration, more features are shown. This example is a good starting point to dive into SCT headfirst.", "previewImage": "lights_thumb.jpg", "category": [ "open source", diff --git a/itemis.create.examples.basic.tutorial/model/01_basic/01.sgen b/itemis.create.examples.basic.tutorial/model/01_basic/01.sgen new file mode 100644 index 00000000..2b8f9041 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/model/01_basic/01.sgen @@ -0,0 +1,16 @@ +GeneratorModel for create::java { + + statechart _01_LightSwitch { + + feature Outlet { + targetProject = "itemis.create.examples.basic.tutorial" + targetFolder = "src-gen" + libraryTargetFolder = "src" + } + + feature Naming { + basePackage = "itemis.create.examples.basic.tutorial" + libraryPackage = "itemis.create" + } + } +} diff --git a/org.yakindu.sct.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc b/itemis.create.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc similarity index 98% rename from org.yakindu.sct.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc rename to itemis.create.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc index fa44a768..5ba70f75 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc +++ b/itemis.create.examples.basic.tutorial/model/01_basic/01_LightSwitch.ysc @@ -13,7 +13,7 @@ - + diff --git a/itemis.create.examples.basic.tutorial/model/02_dimmer/02.sgen b/itemis.create.examples.basic.tutorial/model/02_dimmer/02.sgen new file mode 100644 index 00000000..77446af1 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/model/02_dimmer/02.sgen @@ -0,0 +1,16 @@ +GeneratorModel for create::java { + + statechart _02_DimmableLightSwitch { + + feature Outlet { + targetProject = "itemis.create.examples.basic.tutorial" + targetFolder = "src-gen" + libraryTargetFolder = "src" + } + + feature Naming { + basePackage = "itemis.create.examples.basic.tutorial" + libraryPackage = "itemis.create" + } + } +} diff --git a/org.yakindu.sct.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc b/itemis.create.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc similarity index 98% rename from org.yakindu.sct.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc rename to itemis.create.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc index f8f0a8f4..7b626232 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc +++ b/itemis.create.examples.basic.tutorial/model/02_dimmer/02_DimmableLightSwitch.ysc @@ -15,7 +15,7 @@ - + diff --git a/org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03.sgen b/itemis.create.examples.basic.tutorial/model/03_motionsense/03.sgen similarity index 51% rename from org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03.sgen rename to itemis.create.examples.basic.tutorial/model/03_motionsense/03.sgen index ca7869c4..89a9b4d0 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03.sgen +++ b/itemis.create.examples.basic.tutorial/model/03_motionsense/03.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::java { +GeneratorModel for create::java { statechart _03_MotionLightSwitch { feature Outlet { - targetProject = "org.yakindu.sct.examples.basic.tutorial" + targetProject = "itemis.create.examples.basic.tutorial" targetFolder = "src-gen" libraryTargetFolder = "src" } @@ -13,8 +13,8 @@ GeneratorModel for yakindu::java { } feature Naming { - basePackage = "org.yakindu.sct.examples.basic.tutorial" - libraryPackage = "org.yakindu.sct" + basePackage = "itemis.create.examples.basic.tutorial" + libraryPackage = "itemis.create" } } } diff --git a/org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc b/itemis.create.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc similarity index 99% rename from org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc rename to itemis.create.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc index 410c0739..60143d23 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc +++ b/itemis.create.examples.basic.tutorial/model/03_motionsense/03_MotionLightSwitch.ysc @@ -36,7 +36,7 @@ - + diff --git a/org.yakindu.sct.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc b/itemis.create.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc similarity index 99% rename from org.yakindu.sct.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc rename to itemis.create.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc index 0f28e211..09d65204 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc +++ b/itemis.create.examples.basic.tutorial/model/04_lightsense/04_LightAndMotionSensingLightSwitch.ysc @@ -66,7 +66,7 @@ - + diff --git a/itemis.create.examples.basic.tutorial/model/05_presencesimulation/05.sgen b/itemis.create.examples.basic.tutorial/model/05_presencesimulation/05.sgen new file mode 100644 index 00000000..10ad0551 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/model/05_presencesimulation/05.sgen @@ -0,0 +1,16 @@ +GeneratorModel for create::java { + + statechart _05_PresenceSimulationLightSwitch { + + feature Outlet { + targetProject = "itemis.create.examples.basic.tutorial" + targetFolder = "src-gen" + libraryTargetFolder = "src" + } + + feature Naming { + basePackage = "itemis.create.examples.basic.tutorial" + libraryPackage = "itemis.create" + } + } +} diff --git a/org.yakindu.sct.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc b/itemis.create.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc similarity index 99% rename from org.yakindu.sct.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc rename to itemis.create.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc index ad248aae..d353e65b 100644 --- a/org.yakindu.sct.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc +++ b/itemis.create.examples.basic.tutorial/model/05_presencesimulation/05_PresenceSimulationLightSwitch.ysc @@ -54,7 +54,7 @@ - + diff --git a/org.yakindu.sct.examples.basic.tutorial/src-gen/.gitignore b/itemis.create.examples.basic.tutorial/src-gen/.gitignore similarity index 100% rename from org.yakindu.sct.examples.basic.tutorial/src-gen/.gitignore rename to itemis.create.examples.basic.tutorial/src-gen/.gitignore diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/IEventDriven.java b/itemis.create.examples.basic.tutorial/src/itemis/create/IEventDriven.java new file mode 100644 index 00000000..8b939628 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/IEventDriven.java @@ -0,0 +1,13 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +/** + * Interface for event-driven state machines. + */ +public interface IEventDriven extends IStatemachine { + + /** + * Start a run-to-completion step without any event. + */ + public void triggerWithoutEvent(); +} diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/IStatemachine.java b/itemis.create.examples.basic.tutorial/src/itemis/create/IStatemachine.java new file mode 100644 index 00000000..84e14c4a --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/IStatemachine.java @@ -0,0 +1,30 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +/** + * Basic interface for state machines. + */ +public interface IStatemachine { + + /** + * Enters the state machine. Sets the state machine into a defined state. + */ + public void enter(); + + /** + * Exits the state machine. Leaves the state machine with a defined state. + */ + public void exit(); + + /** + * Checks whether the state machine is active. + * A state machine is active if it has been entered. It is inactive if it has not been entered at all or if it has been exited. + */ + public boolean isActive(); + + /** + * Checks whether all active states are final. + * If there are no active states then the state machine is considered being inactive. In this case this method returns false. + */ + public boolean isFinal(); +} diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/ITimed.java b/itemis.create.examples.basic.tutorial/src/itemis/create/ITimed.java new file mode 100644 index 00000000..7605e4ff --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/ITimed.java @@ -0,0 +1,23 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +/** +* Interface for state machines which use timed event triggers. +*/ +public interface ITimed { + + /** + * Callback method if a time event occurred. + * + * @param eventID the id of the occurred event + */ + public void raiseTimeEvent(int eventID); + + /** + * Set the {@link ITimerService} for the state machine. It must be set + * externally on a timed state machine before enter() is called. + * + * @param timerService the timer service implementation to be set. + */ + public void setTimerService(ITimerService timerService); +} diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/ITimerService.java b/itemis.create.examples.basic.tutorial/src/itemis/create/ITimerService.java new file mode 100644 index 00000000..05c09912 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/ITimerService.java @@ -0,0 +1,27 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +/** + * Defines methods to set and unset timers for a state machine's timed event triggers. + * + */ +public interface ITimerService { + + /** + * Starts the timing for a given time event id. + * + * @param callback an ITimed object that is called when the timer expires + * @param eventID the id of the state machine's time event + * @param time time in milliseconds after which the time event should be triggered + * @param isPeriodic set to true to trigger the time event periodically + */ + public void setTimer(ITimed callback, int eventID, long time, boolean isPeriodic); + + /** + * Unsets a time event. + * + * @param callback an ITimed object that is called when the timer expires + * @param eventID the id of the state machine's time event + */ + public void unsetTimer(ITimed callback, int eventID); +} diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/TimerService.java b/itemis.create.examples.basic.tutorial/src/itemis/create/TimerService.java new file mode 100644 index 00000000..7f86f6f0 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/TimerService.java @@ -0,0 +1,110 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Default timer service implementation. + * + */ +public class TimerService implements ITimerService { + + private final Timer timer = new Timer(); + + private final List timerTaskList = new ArrayList(); + + private final Lock lock = new ReentrantLock(); + + /** + * Timer task that reflects a time event. It's internally used by + * {@link TimerService}. + * + */ + private class TimeEventTask extends TimerTask { + + private ITimed callback; + + int eventID; + + /** + * Constructor for a time event. + * + * @param callback an ITimed object that is called when the timer expires + * @param eventID the id of the state machine's time event + */ + public TimeEventTask(ITimed callback, int eventID) { + this.callback = callback; + this.eventID = eventID; + } + + public void run() { + callback.raiseTimeEvent(eventID); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeEventTask) { + return ((TimeEventTask) obj).callback.equals(callback) + && ((TimeEventTask) obj).eventID == eventID; + } + return super.equals(obj); + } + + @Override + public int hashCode() { + int prime = 37; + int result = 1; + + int c = (int) this.eventID; + result = prime * result + c; + c = this.callback.hashCode(); + result = prime * result + c; + return result; + } + + } + + public void setTimer(final ITimed callback, final int eventID, + long time, boolean isPeriodic) { + + // Create a new TimerTask for given event and store it. + TimeEventTask timerTask = new TimeEventTask(callback, eventID); + lock.lock(); + timerTaskList.add(timerTask); + + // start scheduling the timer + if (isPeriodic) { + timer.scheduleAtFixedRate(timerTask, time, time); + } else { + timer.schedule(timerTask, time); + } + lock.unlock(); + } + + public void unsetTimer(ITimed callback, int eventID) { + lock.lock(); + int index = timerTaskList.indexOf(new TimeEventTask(callback, eventID)); + if (index != -1) { + timerTaskList.get(index).cancel(); + timer.purge(); + timerTaskList.remove(index); + } + lock.unlock(); + } + + /** + * Cancel timer service. Use this to end possible timing threads and free + * memory resources. + */ + public void cancel() { + lock.lock(); + timer.cancel(); + timer.purge(); + lock.unlock(); + } +} diff --git a/itemis.create.examples.basic.tutorial/src/itemis/create/VirtualTimer.java b/itemis.create.examples.basic.tutorial/src/itemis/create/VirtualTimer.java new file mode 100644 index 00000000..6fb7dfe1 --- /dev/null +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/VirtualTimer.java @@ -0,0 +1,211 @@ +/** Generated by itemis CREATE code generator. */ +package itemis.create; + +import java.math.BigInteger; +import java.util.PriorityQueue; +import java.util.Queue; + +public class VirtualTimer implements ITimerService { + + private BigInteger stopTime = BigInteger.ZERO; + protected BigInteger currentTime = BigInteger.ZERO; + protected long cyclePeriod = 0; + protected BigInteger scheduleCount = BigInteger.ZERO; + + private Queue tasks; + + public abstract static class VirtualTimeTask implements Runnable, Comparable { + + BigInteger nextExecutionTime = BigInteger.ZERO; + long interval = 0; + long period = -1; + BigInteger scheduleOrder = BigInteger.ZERO; + boolean isCanceled = false; + + public int compareTo(VirtualTimeTask o) { + + BigInteger diff = BigInteger.ZERO; + + if (!nextExecutionTime.equals(o.nextExecutionTime)) { + diff = nextExecutionTime.subtract(o.nextExecutionTime); + } else if (o instanceof CycleTimeEventTask && !(this instanceof CycleTimeEventTask)) { + return -1; + } else if (!(o instanceof CycleTimeEventTask) && this instanceof CycleTimeEventTask) { + return 1; + } else { + diff = scheduleOrder.subtract(o.scheduleOrder); + } + return diff.compareTo(BigInteger.ZERO); + } + + public boolean isCanceled() { + return isCanceled; + } + + public void cancel() { + isCanceled = true; + } + } + + public static class VirtualTimeEventTask extends VirtualTimeTask { + + private final int eventID; + private ITimed callback; + + public VirtualTimeEventTask(ITimed callback, int eventID) { + this.callback = callback; + this.eventID = eventID; + } + + public int getEventId() { + return eventID; + } + + public ITimed getCallback() { + return callback; + } + + public void run() { + callback.raiseTimeEvent(eventID); + } + + } + + public static class CycleTimeEventTask extends VirtualTimeTask { + + private IEventDriven statemachine; + + public CycleTimeEventTask(IEventDriven statemachine) { + this.statemachine = statemachine; + } + + public void run() { + } + + } + + public VirtualTimer() { + tasks = new PriorityQueue(); + } + + public VirtualTimer(long cyclePeriod) { + tasks = new PriorityQueue(); + this.cyclePeriod = cyclePeriod; + } + + public void timeLeap(long ms) { + stopTime = currentTime.add(BigInteger.valueOf(ms)); + processTasks(); + } + + public void cycleLeap(long cycles){ + int elapsedCycles = 0; + + while (elapsedCycles < cycles) { + + VirtualTimeTask cycleTask = getCycleTask(); + if (cycleTask == null) + return; + + long timeToNextCycle = cycleTask.nextExecutionTime.subtract(currentTime).longValue(); + timeLeap(timeToNextCycle); + elapsedCycles += 1; + } + } + + @Override + public void setTimer(ITimed callback, int eventID, long duration, boolean isPeriodical) { + if (duration <= 0) + duration = 1; + VirtualTimeEventTask timeEventTask = new VirtualTimeEventTask(callback, eventID); + if (isPeriodical) { + schedulePeriodicalTask(timeEventTask, duration, duration); + } else { + scheduleTask(timeEventTask, duration); + } + } + + @Override + public void unsetTimer(ITimed callback, int eventID) { + VirtualTimeTask timerTask = getTask(callback, eventID); + if (timerTask != null) + timerTask.cancel(); + } + + public void scheduleTask(VirtualTimeTask task, long interval) { + task.interval = interval; + scheduleInternal(task, currentTime.add(BigInteger.valueOf(interval)), -1); + } + + public void schedulePeriodicalTask(VirtualTimeTask task, long interval, long period) { + scheduleInternal(task, currentTime.add(BigInteger.valueOf(interval)), period); + } + + private void scheduleInternal(VirtualTimeTask task, BigInteger time, long period) { + task.nextExecutionTime = time; + task.period = period; + task.scheduleOrder = scheduleCount; + scheduleCount = scheduleCount.add(BigInteger.ONE); + tasks.add(task); + } + + protected VirtualTimeTask getTask(ITimed callback, int eventName) { + for (VirtualTimeTask virtualTimeTask : tasks) { + if (!(virtualTimeTask instanceof VirtualTimeEventTask)) + continue; + if (((VirtualTimeEventTask) virtualTimeTask).getEventId() == eventName + && ((VirtualTimeEventTask) virtualTimeTask).getCallback() == callback) + return virtualTimeTask; + } + return null; + } + + protected CycleTimeEventTask getCycleTask() { + for (VirtualTimeTask task : tasks) { + if (task instanceof CycleTimeEventTask && !task.isCanceled()) { + return (CycleTimeEventTask) task; + } + } + return null; + } + + protected void processTasks() { + boolean processTasks = !tasks.isEmpty(); + while (processTasks) { + VirtualTimeTask task = tasks.peek(); + if (task == null) + break; + if (task.isCanceled) { + tasks.remove(); + continue; + } + + if (task.nextExecutionTime.compareTo(stopTime) <= 0) { + currentTime = task.nextExecutionTime; + task = tasks.poll(); + if (task.period > -1) { + task.nextExecutionTime = currentTime.add(BigInteger.valueOf(task.period)); + tasks.add(task); + } + task.run(); + } else { + currentTime = stopTime; + processTasks = false; + } + } + } + + public synchronized void stop() { + for (VirtualTimeTask timerTask : tasks) { + timerTask.cancel(); + } + cancel(); + } + + public void cancel() { + synchronized (tasks) { + tasks.clear(); + } + } + +} diff --git a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_01.java b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_01.java similarity index 79% rename from org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_01.java rename to itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_01.java index d7f6472a..6bfa9d7c 100644 --- a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_01.java +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_01.java @@ -1,6 +1,6 @@ -package org.yakindu.sct.examples.lightswitch; +package itemis.create.examples.lightswitch; -import org.yakindu.sct.examples.basic.tutorial._01_LightSwitch; +import itemis.create.examples.basic.tutorial._01_LightSwitch; public class LightSwitch_01 { diff --git a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_02.java b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_02.java similarity index 87% rename from org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_02.java rename to itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_02.java index ccd93522..019209a5 100644 --- a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_02.java +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_02.java @@ -1,10 +1,10 @@ -package org.yakindu.sct.examples.lightswitch; +package itemis.create.examples.lightswitch; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import org.yakindu.sct.examples.basic.tutorial._02_DimmableLightSwitch; +import itemis.create.examples.basic.tutorial._02_DimmableLightSwitch; public class LightSwitch_02 { diff --git a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_03.java b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_03.java similarity index 90% rename from org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_03.java rename to itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_03.java index fe082146..46d924ad 100644 --- a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_03.java +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_03.java @@ -1,11 +1,11 @@ -package org.yakindu.sct.examples.lightswitch; +package itemis.create.examples.lightswitch; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import org.yakindu.sct.TimerService; -import org.yakindu.sct.examples.basic.tutorial._03_MotionLightSwitch; +import itemis.create.TimerService; +import itemis.create.examples.basic.tutorial._03_MotionLightSwitch; public class LightSwitch_03 { diff --git a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_05.java b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_05.java similarity index 89% rename from org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_05.java rename to itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_05.java index 015893e2..1d678e1e 100644 --- a/org.yakindu.sct.examples.basic.tutorial/src/org/yakindu/sct/examples/lightswitch/LightSwitch_05.java +++ b/itemis.create.examples.basic.tutorial/src/itemis/create/examples/lightswitch/LightSwitch_05.java @@ -1,4 +1,4 @@ -package org.yakindu.sct.examples.lightswitch; +package itemis.create.examples.lightswitch; import java.io.BufferedReader; import java.io.IOException; @@ -6,9 +6,9 @@ import java.time.LocalDateTime; import java.util.Random; -import org.yakindu.sct.TimerService; -import org.yakindu.sct.examples.basic.tutorial._05_PresenceSimulationLightSwitch; -import org.yakindu.sct.examples.basic.tutorial._05_PresenceSimulationLightSwitch.State; +import itemis.create.TimerService; +import itemis.create.examples.basic.tutorial._05_PresenceSimulationLightSwitch; +import itemis.create.examples.basic.tutorial._05_PresenceSimulationLightSwitch.State; public class LightSwitch_05 { diff --git a/itemis.create.examples.blinky.cpp.arduino/.cproject b/itemis.create.examples.blinky.cpp.arduino/.cproject new file mode 100644 index 00000000..bfcea9f1 --- /dev/null +++ b/itemis.create.examples.blinky.cpp.arduino/.cproject @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/.gitignore b/itemis.create.examples.blinky.cpp.arduino/.gitignore similarity index 100% rename from com.yakindu.sct.examples.blinky.cpp.arduino/.gitignore rename to itemis.create.examples.blinky.cpp.arduino/.gitignore diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/.project b/itemis.create.examples.blinky.cpp.arduino/.project similarity index 96% rename from com.yakindu.sct.examples.blinky.cpp.arduino/.project rename to itemis.create.examples.blinky.cpp.arduino/.project index ac22e9ef..792fac9b 100644 --- a/com.yakindu.sct.examples.blinky.cpp.arduino/.project +++ b/itemis.create.examples.blinky.cpp.arduino/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.blinky.cpp.arduino + itemis.create.examples.blinky.cpp.arduino diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/css/style.css b/itemis.create.examples.blinky.cpp.arduino/css/style.css similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/css/style.css rename to itemis.create.examples.blinky.cpp.arduino/css/style.css diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/images/arduino.jpg b/itemis.create.examples.blinky.cpp.arduino/images/arduino.jpg similarity index 100% rename from com.yakindu.sct.examples.blinky.cpp.arduino/images/arduino.jpg rename to itemis.create.examples.blinky.cpp.arduino/images/arduino.jpg diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/index.html b/itemis.create.examples.blinky.cpp.arduino/index.html similarity index 97% rename from com.yakindu.sct.examples.blinky.cpp.arduino/index.html rename to itemis.create.examples.blinky.cpp.arduino/index.html index 43ad1d63..244156bc 100644 --- a/com.yakindu.sct.examples.blinky.cpp.arduino/index.html +++ b/itemis.create.examples.blinky.cpp.arduino/index.html @@ -1,61 +1,61 @@ - - - - -[Pro] Blinky LED (C++) for Arduino - - - - -
    -

    [Pro] Blinky LED (C++) for Arduino

    -

    - This is a simple example of how to use the C/C++ Domain together with an Arduino. C++ Timer are integrated. - The underlying statechart looks as follows: -

    -

    Arduino uno -

    -

    Addons for compiling and flashing

    -

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. -

    How to install the Sloeber plugin

    -

    - There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. -

    -

    - Another way is installing the plugin manually. You need to follow these steps: -

      -
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. -
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. -
    5. Choose the plugin - not the IDE.
    6. -
    7. Follow the instructions
    8. -
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. -
    -

    Configure the Sloeber plugin

    -

    - After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. - Initially, the projects are not configured, as you may require to add the toolchain: -

      -
    1. Click on Window -> Preferences
    2. -
    3. Open the Arduino window -> Platforms and Boards
    4. -
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. -
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. -
    - Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. -

    -

    Configure the example

    - Once you have installed the toolchain for your Arduino, you can configure the project. -
      -
    1. Right click the project and open the Preference page
    2. -
    3. Open the Arduino window
    4. -
    5. Choose your platform and port
    6. -
    - There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. -

    Compile and upload

    -

    - Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! -

    -
    - - + + + + +[Pro] Blinky LED (C++) for Arduino + + + + +
    +

    [Pro] Blinky LED (C++) for Arduino

    +

    + This is a simple example of how to use the C/C++ Domain together with an Arduino. C++ Timer are integrated. + The underlying statechart looks as follows: +

    +

    Arduino uno +

    +

    Addons for compiling and flashing

    +

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. +

    How to install the Sloeber plugin

    +

    + There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. +

    +

    + Another way is installing the plugin manually. You need to follow these steps: +

      +
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. +
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. +
    5. Choose the plugin - not the IDE.
    6. +
    7. Follow the instructions
    8. +
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. +
    +

    Configure the Sloeber plugin

    +

    + After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. + Initially, the projects are not configured, as you may require to add the toolchain: +

      +
    1. Click on Window -> Preferences
    2. +
    3. Open the Arduino window -> Platforms and Boards
    4. +
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. +
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. +
    + Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. +

    +

    Configure the example

    + Once you have installed the toolchain for your Arduino, you can configure the project. +
      +
    1. Right click the project and open the Preference page
    2. +
    3. Open the Arduino window
    4. +
    5. Choose your platform and port
    6. +
    + There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. +

    Compile and upload

    +

    + Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! +

    +
    + + diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/main.ino b/itemis.create.examples.blinky.cpp.arduino/main.ino similarity index 100% rename from com.yakindu.sct.examples.blinky.cpp.arduino/main.ino rename to itemis.create.examples.blinky.cpp.arduino/main.ino diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/metadata.json b/itemis.create.examples.blinky.cpp.arduino/metadata.json similarity index 89% rename from com.yakindu.sct.examples.blinky.cpp.arduino/metadata.json rename to itemis.create.examples.blinky.cpp.arduino/metadata.json index 962601f6..e177d3b7 100644 --- a/com.yakindu.sct.examples.blinky.cpp.arduino/metadata.json +++ b/itemis.create.examples.blinky.cpp.arduino/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.blinky.cpp.arduino", + "id": "itemis.create.examples.blinky.cpp.arduino", "title": "Arduino - Blinky LED (Deep C++)", "author": "itemis AG", "description": "This is a simple example of how to use the C/C++ Domain together with an Arduino. C++ Timer are integrated", diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen b/itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen similarity index 60% rename from com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen rename to itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen index ef699744..42abc409 100644 --- a/com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen +++ b/itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { statechart Arduino_Blinky_SCT { feature Outlet { - targetProject = "com.yakindu.sct.examples.blinky.cpp.arduino" + targetProject = "itemis.create.examples.blinky.cpp.arduino" targetFolder = "src-gen" } diff --git a/com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc b/itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc similarity index 98% rename from com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc rename to itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc index 77437ee0..9d91d2d9 100644 --- a/com.yakindu.sct.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc +++ b/itemis.create.examples.blinky.cpp.arduino/model/Arduino_Blinky_SCT.ysc @@ -16,7 +16,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.c/.cproject b/itemis.create.examples.codegen.c/.cproject similarity index 98% rename from org.yakindu.sct.examples.codegen.c/.cproject rename to itemis.create.examples.codegen.c/.cproject index 5470db1b..1a463398 100644 --- a/org.yakindu.sct.examples.codegen.c/.cproject +++ b/itemis.create.examples.codegen.c/.cproject @@ -115,10 +115,10 @@ - + - + diff --git a/org.yakindu.sct.examples.codegen.c/.gitignore b/itemis.create.examples.codegen.c/.gitignore similarity index 100% rename from org.yakindu.sct.examples.codegen.c/.gitignore rename to itemis.create.examples.codegen.c/.gitignore diff --git a/org.yakindu.sct.examples.codegen.c/.project b/itemis.create.examples.codegen.c/.project similarity index 94% rename from org.yakindu.sct.examples.codegen.c/.project rename to itemis.create.examples.codegen.c/.project index cecc5410..d79972de 100644 --- a/org.yakindu.sct.examples.codegen.c/.project +++ b/itemis.create.examples.codegen.c/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.codegen.c + itemis.create.examples.codegen.c diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/css/style.css b/itemis.create.examples.codegen.c/css/style.css similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/css/style.css rename to itemis.create.examples.codegen.c/css/style.css diff --git a/org.yakindu.sct.examples.codegen.c/images/console.png b/itemis.create.examples.codegen.c/images/console.png similarity index 100% rename from org.yakindu.sct.examples.codegen.c/images/console.png rename to itemis.create.examples.codegen.c/images/console.png diff --git a/org.yakindu.sct.examples.codegen.c/images/content-assist.gif b/itemis.create.examples.codegen.c/images/content-assist.gif similarity index 100% rename from org.yakindu.sct.examples.codegen.c/images/content-assist.gif rename to itemis.create.examples.codegen.c/images/content-assist.gif diff --git a/org.yakindu.sct.examples.codegen.c/images/model.png b/itemis.create.examples.codegen.c/images/model.png similarity index 100% rename from org.yakindu.sct.examples.codegen.c/images/model.png rename to itemis.create.examples.codegen.c/images/model.png diff --git a/com.yakindu.sct.examples.codegen.multism.c/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.c/images/watch_gears_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.c/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.codegen.c/index.html b/itemis.create.examples.codegen.c/index.html similarity index 90% rename from org.yakindu.sct.examples.codegen.c/index.html rename to itemis.create.examples.codegen.c/index.html index d4bed3ad..7c88d167 100644 --- a/org.yakindu.sct.examples.codegen.c/index.html +++ b/itemis.create.examples.codegen.c/index.html @@ -8,7 +8,7 @@
    - + DISCLAIMER: This example only work with UNIX based systems due to the nature of Eclipse console

    C Code Generation

    This example demonstrates how to generate C code from a statechart. We will use a simple light switch example and focus on the generator model.

    @@ -27,7 +27,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    The generator model defines where the code should be generated into, and enables the generation of a default timer service. Besides setting up the target location, the generator model allows you to adjust several aspects of the generated code like naming, license comments or function inlining. Press [CTRL]+[SPACE] to get a list of available features. For more information, please refer to our documentation. @@ -43,7 +43,7 @@

    Invoking Code Generation

    The Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model @@ -52,7 +52,7 @@

    The Example Application

    Our application is a simple interactive console with which the user can switch the light on or off. The complete application code is implemented in main.c:

    - +

    The most important parts are commented in the main.c file. These are the bullet points: diff --git a/org.yakindu.sct.examples.codegen.c/metadata.json b/itemis.create.examples.codegen.c/metadata.json similarity index 84% rename from org.yakindu.sct.examples.codegen.c/metadata.json rename to itemis.create.examples.codegen.c/metadata.json index 89a71b8f..b6b3bd6e 100644 --- a/org.yakindu.sct.examples.codegen.c/metadata.json +++ b/itemis.create.examples.codegen.c/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.codegen.c", + "id": "itemis.create.examples.codegen.c", "title": "C Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate C code from a statechart.", diff --git a/org.yakindu.sct.examples.codegen.c/models/c.sgen b/itemis.create.examples.codegen.c/models/c.sgen similarity index 80% rename from org.yakindu.sct.examples.codegen.c/models/c.sgen rename to itemis.create.examples.codegen.c/models/c.sgen index 8a8813d7..c41fb4a5 100644 --- a/org.yakindu.sct.examples.codegen.c/models/c.sgen +++ b/itemis.create.examples.codegen.c/models/c.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.codegen.c" + targetProject = "itemis.create.examples.codegen.c" targetFolder = "src-gen" } /* Generate a default timer service implementation */ diff --git a/org.yakindu.sct.examples.codegen.c/models/light_switch.ysc b/itemis.create.examples.codegen.c/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.codegen.c/models/light_switch.ysc rename to itemis.create.examples.codegen.c/models/light_switch.ysc index 7e46f0ca..7519822b 100644 --- a/org.yakindu.sct.examples.codegen.c/models/light_switch.ysc +++ b/itemis.create.examples.codegen.c/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.c/src/main.c b/itemis.create.examples.codegen.c/src/main.c similarity index 100% rename from org.yakindu.sct.examples.codegen.c/src/main.c rename to itemis.create.examples.codegen.c/src/main.c diff --git a/org.yakindu.sct.examples.codegen.cpp/.cproject b/itemis.create.examples.codegen.cpp/.cproject similarity index 94% rename from org.yakindu.sct.examples.codegen.cpp/.cproject rename to itemis.create.examples.codegen.cpp/.cproject index 60eb1b45..fa2e9665 100644 --- a/org.yakindu.sct.examples.codegen.cpp/.cproject +++ b/itemis.create.examples.codegen.cpp/.cproject @@ -18,7 +18,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -103,7 +103,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.cpp/.gitignore b/itemis.create.examples.codegen.cpp/.gitignore similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/.gitignore rename to itemis.create.examples.codegen.cpp/.gitignore diff --git a/org.yakindu.sct.examples.sctunit.c/.project b/itemis.create.examples.codegen.cpp/.project similarity index 95% rename from org.yakindu.sct.examples.sctunit.c/.project rename to itemis.create.examples.codegen.cpp/.project index 887243f6..5ab688d9 100644 --- a/org.yakindu.sct.examples.sctunit.c/.project +++ b/itemis.create.examples.codegen.cpp/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.sctunit.c + itemis.create.examples.codegen.cpp diff --git a/com.yakindu.sct.examples.trafficlight.multism/css/style.css b/itemis.create.examples.codegen.cpp/css/style.css similarity index 100% rename from com.yakindu.sct.examples.trafficlight.multism/css/style.css rename to itemis.create.examples.codegen.cpp/css/style.css diff --git a/org.yakindu.sct.examples.codegen.cpp/images/console.png b/itemis.create.examples.codegen.cpp/images/console.png similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/images/console.png rename to itemis.create.examples.codegen.cpp/images/console.png diff --git a/org.yakindu.sct.examples.codegen.cpp/images/content-assist.gif b/itemis.create.examples.codegen.cpp/images/content-assist.gif similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/images/content-assist.gif rename to itemis.create.examples.codegen.cpp/images/content-assist.gif diff --git a/org.yakindu.sct.examples.codegen.cpp/images/model.png b/itemis.create.examples.codegen.cpp/images/model.png similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/images/model.png rename to itemis.create.examples.codegen.cpp/images/model.png diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.cpp/images/watch_gears_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.cpp/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.codegen.cpp/index.html b/itemis.create.examples.codegen.cpp/index.html similarity index 93% rename from org.yakindu.sct.examples.codegen.cpp/index.html rename to itemis.create.examples.codegen.cpp/index.html index 246c5898..8238fcd6 100644 --- a/org.yakindu.sct.examples.codegen.cpp/index.html +++ b/itemis.create.examples.codegen.cpp/index.html @@ -27,7 +27,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    The generator model defines where the code should be generated into, and enables the generation of a default timer service. Besides setting up the target location, the generator model allows you to adjust several aspects of the generated code like naming, license comments or function inlining. Press [CTRL]+[SPACE] to get a list of available features. For more information, please refer to our documentation. @@ -43,7 +43,7 @@

    Invoking Code Generation

    The Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model @@ -52,7 +52,7 @@

    The Example Application

    Our application is a simple interactive console with which the user can switch the light on or off. The complete application code is implemented in main.cpp:

    - +

    The most important parts are commented in the main.cpp file. These are the bullet points: diff --git a/org.yakindu.sct.examples.codegen.cpp/metadata.json b/itemis.create.examples.codegen.cpp/metadata.json similarity index 83% rename from org.yakindu.sct.examples.codegen.cpp/metadata.json rename to itemis.create.examples.codegen.cpp/metadata.json index 3e1b5780..2a5dc28e 100644 --- a/org.yakindu.sct.examples.codegen.cpp/metadata.json +++ b/itemis.create.examples.codegen.cpp/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.codegen.cpp", + "id": "itemis.create.examples.codegen.cpp", "title": "C++ Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate C++ code from a statechart.", diff --git a/org.yakindu.sct.examples.codegen.cpp/models/cpp.sgen b/itemis.create.examples.codegen.cpp/models/cpp.sgen similarity index 79% rename from org.yakindu.sct.examples.codegen.cpp/models/cpp.sgen rename to itemis.create.examples.codegen.cpp/models/cpp.sgen index 4c6d15a7..9ffb8b63 100644 --- a/org.yakindu.sct.examples.codegen.cpp/models/cpp.sgen +++ b/itemis.create.examples.codegen.cpp/models/cpp.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.codegen.cpp" + targetProject = "itemis.create.examples.codegen.cpp" targetFolder = "src-gen" } /* Generate a default timer service implementation */ diff --git a/org.yakindu.sct.examples.codegen.cpp/models/light_switch.ysc b/itemis.create.examples.codegen.cpp/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.codegen.cpp/models/light_switch.ysc rename to itemis.create.examples.codegen.cpp/models/light_switch.ysc index 7e46f0ca..7519822b 100644 --- a/org.yakindu.sct.examples.codegen.cpp/models/light_switch.ysc +++ b/itemis.create.examples.codegen.cpp/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.cpp/src/main.cpp b/itemis.create.examples.codegen.cpp/src/main.cpp similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/src/main.cpp rename to itemis.create.examples.codegen.cpp/src/main.cpp diff --git a/com.yakindu.sct.examples.codegen.multism.java/.classpath b/itemis.create.examples.codegen.java/.classpath similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/.classpath rename to itemis.create.examples.codegen.java/.classpath diff --git a/com.yakindu.sct.examples.codegen.multism.java/.gitignore b/itemis.create.examples.codegen.java/.gitignore similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/.gitignore rename to itemis.create.examples.codegen.java/.gitignore diff --git a/org.yakindu.sct.examples.basic.tutorial/.project b/itemis.create.examples.codegen.java/.project similarity index 92% rename from org.yakindu.sct.examples.basic.tutorial/.project rename to itemis.create.examples.codegen.java/.project index 2bbaf558..c6d575da 100644 --- a/org.yakindu.sct.examples.basic.tutorial/.project +++ b/itemis.create.examples.codegen.java/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.basic.tutorial + itemis.create.examples.codegen.java diff --git a/com.yakindu.sct.examples.zowi.cpp.arduino/css/style.css b/itemis.create.examples.codegen.java/css/style.css similarity index 100% rename from com.yakindu.sct.examples.zowi.cpp.arduino/css/style.css rename to itemis.create.examples.codegen.java/css/style.css diff --git a/org.yakindu.sct.examples.codegen.java/images/console.png b/itemis.create.examples.codegen.java/images/console.png similarity index 100% rename from org.yakindu.sct.examples.codegen.java/images/console.png rename to itemis.create.examples.codegen.java/images/console.png diff --git a/org.yakindu.sct.examples.codegen.java/images/content-assist.gif b/itemis.create.examples.codegen.java/images/content-assist.gif similarity index 100% rename from org.yakindu.sct.examples.codegen.java/images/content-assist.gif rename to itemis.create.examples.codegen.java/images/content-assist.gif diff --git a/org.yakindu.sct.examples.codegen.java/images/model.png b/itemis.create.examples.codegen.java/images/model.png similarity index 100% rename from org.yakindu.sct.examples.codegen.java/images/model.png rename to itemis.create.examples.codegen.java/images/model.png diff --git a/com.yakindu.sct.examples.codegen.multism.java/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.java/images/watch_gears_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.java/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.codegen.java/index.html b/itemis.create.examples.codegen.java/index.html similarity index 91% rename from org.yakindu.sct.examples.codegen.java/index.html rename to itemis.create.examples.codegen.java/index.html index e827f990..f25244e9 100644 --- a/org.yakindu.sct.examples.codegen.java/index.html +++ b/itemis.create.examples.codegen.java/index.html @@ -27,7 +27,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    The generator model defines where the code should be generated into, and enables the generation of a default timer service. Besides setting up the target location and the package names, the generator model allows you to adjust several aspects of the generated code like naming, license comments or function inlining. Press [CTRL]+[SPACE] to get a list of available features. For more information, please refer to our documentation. @@ -43,7 +43,7 @@

    Invoking Code Generation

    The Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model @@ -52,7 +52,7 @@

    The Example Application

    Our application is a simple interactive console with which the user can switch the light on or off. The complete application code is implemented in Main.java:

    - +

    The most important parts are commented in the Main.java file. These are the bullet points: diff --git a/org.yakindu.sct.examples.codegen.java/metadata.json b/itemis.create.examples.codegen.java/metadata.json similarity index 83% rename from org.yakindu.sct.examples.codegen.java/metadata.json rename to itemis.create.examples.codegen.java/metadata.json index 0ebbaf4a..aea2cb23 100644 --- a/org.yakindu.sct.examples.codegen.java/metadata.json +++ b/itemis.create.examples.codegen.java/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.codegen.java", + "id": "itemis.create.examples.codegen.java", "title": "Java Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate Java code from a statechart.", diff --git a/org.yakindu.sct.examples.codegen.java/models/java.sgen b/itemis.create.examples.codegen.java/models/java.sgen similarity index 72% rename from org.yakindu.sct.examples.codegen.java/models/java.sgen rename to itemis.create.examples.codegen.java/models/java.sgen index 3f7afaaa..1613320f 100644 --- a/org.yakindu.sct.examples.codegen.java/models/java.sgen +++ b/itemis.create.examples.codegen.java/models/java.sgen @@ -1,15 +1,15 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::java { +GeneratorModel for create::java { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.codegen.java" + targetProject = "itemis.create.examples.codegen.java" targetFolder = "src-gen" } /* Specify package names */ feature Naming { - basePackage = "org.yakindu.sct.examples.codegen.java" + basePackage = "itemis.create.examples.codegen.java" } /* Generate a default timer service implementation */ feature GeneralFeatures { diff --git a/org.yakindu.sct.examples.codegen.java/models/light_switch.ysc b/itemis.create.examples.codegen.java/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.codegen.java/models/light_switch.ysc rename to itemis.create.examples.codegen.java/models/light_switch.ysc index 7e46f0ca..7519822b 100644 --- a/org.yakindu.sct.examples.codegen.java/models/light_switch.ysc +++ b/itemis.create.examples.codegen.java/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.java/src/org/yakindu/sct/examples/codegen/java/Main.java b/itemis.create.examples.codegen.java/src/itemis/create/examples/codegen/java/Main.java similarity index 93% rename from org.yakindu.sct.examples.codegen.java/src/org/yakindu/sct/examples/codegen/java/Main.java rename to itemis.create.examples.codegen.java/src/itemis/create/examples/codegen/java/Main.java index a011c7cc..9a5e37e0 100644 --- a/org.yakindu.sct.examples.codegen.java/src/org/yakindu/sct/examples/codegen/java/Main.java +++ b/itemis.create.examples.codegen.java/src/itemis/create/examples/codegen/java/Main.java @@ -1,9 +1,9 @@ -package org.yakindu.sct.examples.codegen.java; +package itemis.create.examples.codegen.java; import java.util.Scanner; -import com.yakindu.core.TimerService; -import com.yakindu.core.rx.Observer; +import itemis.create.core.TimerService; +import itemis.create.core.rx.Observer; public class Main { diff --git a/com.yakindu.sct.examples.codegen.multism.c/.cproject b/itemis.create.examples.codegen.multism.c/.cproject similarity index 76% rename from com.yakindu.sct.examples.codegen.multism.c/.cproject rename to itemis.create.examples.codegen.multism.c/.cproject index 22485576..deec2393 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/.cproject +++ b/itemis.create.examples.codegen.multism.c/.cproject @@ -5,40 +5,40 @@ - + - - + + - - - - - - - - + + + + + - - - + + + - - - diff --git a/com.yakindu.sct.examples.codegen.multism.c/.gitignore b/itemis.create.examples.codegen.multism.c/.gitignore similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/.gitignore rename to itemis.create.examples.codegen.multism.c/.gitignore diff --git a/org.yakindu.sct.examples.fmu.bouncingball/.project b/itemis.create.examples.codegen.multism.c/.project similarity index 94% rename from org.yakindu.sct.examples.fmu.bouncingball/.project rename to itemis.create.examples.codegen.multism.c/.project index 9e30e325..c4e1b28e 100644 --- a/org.yakindu.sct.examples.fmu.bouncingball/.project +++ b/itemis.create.examples.codegen.multism.c/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.fmu.bouncingball + itemis.create.examples.codegen.multism.c diff --git a/org.yakindu.sct.examples.basic.childfirst/css/style.css b/itemis.create.examples.codegen.multism.c/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.childfirst/css/style.css rename to itemis.create.examples.codegen.multism.c/css/style.css diff --git a/com.yakindu.sct.examples.codegen.multism.c/images/console.png b/itemis.create.examples.codegen.multism.c/images/console.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/images/console.png rename to itemis.create.examples.codegen.multism.c/images/console.png diff --git a/com.yakindu.sct.examples.codegen.multism.c/images/light.png b/itemis.create.examples.codegen.multism.c/images/light.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/images/light.png rename to itemis.create.examples.codegen.multism.c/images/light.png diff --git a/com.yakindu.sct.examples.codegen.multism.c/images/light_controller_defsection.png b/itemis.create.examples.codegen.multism.c/images/light_controller_defsection.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/images/light_controller_defsection.png rename to itemis.create.examples.codegen.multism.c/images/light_controller_defsection.png diff --git a/com.yakindu.sct.examples.codegen.multism.c/images/light_controller_machine.png b/itemis.create.examples.codegen.multism.c/images/light_controller_machine.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.c/images/light_controller_machine.png rename to itemis.create.examples.codegen.multism.c/images/light_controller_machine.png diff --git a/com.yakindu.sct.examples.codegen.multism.python/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.multism.c/images/watch_gears_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.multism.c/images/watch_gears_thumb.jpg diff --git a/com.yakindu.sct.examples.codegen.multism.c/index.html b/itemis.create.examples.codegen.multism.c/index.html similarity index 94% rename from com.yakindu.sct.examples.codegen.multism.c/index.html rename to itemis.create.examples.codegen.multism.c/index.html index 0a05775a..f06c5f8d 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/index.html +++ b/itemis.create.examples.codegen.multism.c/index.html @@ -8,7 +8,7 @@

    - + DISCLAIMER: This example only work with UNIX based systems due to the nature of Eclipse console

    C Code Generation for Multi State Machines

    This example demonstrates how to generate C code for a multi state machine scenario and how to set everything up in the application code. As example, we will use a light controller that controls two lights. The controller as well as the lights are defined by state machines that communicate with each other by the means of events.

    @@ -45,7 +45,7 @@

    Generator Model

    The generator model simply defines the configuration for both state machines. As the state machines use time events, we ensure that a timer service implementation is generated with the TimerService parameter.

    - +

    @@ -59,7 +59,7 @@

    Application Code

    Our application is a simple interactive console with which the user can switch the lights on or off as well as toggle the blink mode. The complete application code is implemented in main.c:

    - +

    The most important parts are commented in the main.c file. These are the bullet points: diff --git a/com.yakindu.sct.examples.codegen.multism.c/metadata.json b/itemis.create.examples.codegen.multism.c/metadata.json similarity index 84% rename from com.yakindu.sct.examples.codegen.multism.c/metadata.json rename to itemis.create.examples.codegen.multism.c/metadata.json index a08c52bd..28de1d6a 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/metadata.json +++ b/itemis.create.examples.codegen.multism.c/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.codegen.multism.c", + "id": "itemis.create.examples.codegen.multism.c", "title": "C Code Generation for Multi State Machines", "author": "itemis AG", "description": "This example demonstrates how to generate C code from a multi state machine scenario.", diff --git a/com.yakindu.sct.examples.codegen.multism.c/models/c.sgen b/itemis.create.examples.codegen.multism.c/models/c.sgen similarity index 74% rename from com.yakindu.sct.examples.codegen.multism.c/models/c.sgen rename to itemis.create.examples.codegen.multism.c/models/c.sgen index 4e8877bf..42a914c3 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/models/c.sgen +++ b/itemis.create.examples.codegen.multism.c/models/c.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { - const PROJECT : string = "com.yakindu.sct.examples.codegen.multism.c" + const PROJECT : string = "itemis.create.examples.codegen.multism.c" const FOLDER : string = "src-gen" diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/models/light.ysc b/itemis.create.examples.codegen.multism.c/models/light.ysc similarity index 98% rename from com.yakindu.sct.examples.codegen.multism.cpp/models/light.ysc rename to itemis.create.examples.codegen.multism.c/models/light.ysc index 089ce962..1a25da3b 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/models/light.ysc +++ b/itemis.create.examples.codegen.multism.c/models/light.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/models/light_controller.ysc b/itemis.create.examples.codegen.multism.c/models/light_controller.ysc similarity index 99% rename from com.yakindu.sct.examples.codegen.multism.cpp/models/light_controller.ysc rename to itemis.create.examples.codegen.multism.c/models/light_controller.ysc index 8a2f112e..7dbf6576 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/models/light_controller.ysc +++ b/itemis.create.examples.codegen.multism.c/models/light_controller.ysc @@ -24,7 +24,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.c/src/main.c b/itemis.create.examples.codegen.multism.c/src/main.c similarity index 98% rename from com.yakindu.sct.examples.codegen.multism.c/src/main.c rename to itemis.create.examples.codegen.multism.c/src/main.c index a7d239eb..2d508864 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/src/main.c +++ b/itemis.create.examples.codegen.multism.c/src/main.c @@ -104,7 +104,7 @@ int main(int argc, char **argv) { time_offset = get_ms(); /*! Ensures non-blocking read() call. */ - fcntl(STDIN_FILENO, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK); + //fcntl(STDIN_FILENO, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK); printf("Type 1 or 0 to switch the lights on or off.\n"); printf("Type 2 to toggle the blink mode.\n"); while (1) { diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/.cproject b/itemis.create.examples.codegen.multism.cpp/.cproject similarity index 75% rename from com.yakindu.sct.examples.codegen.multism.cpp/.cproject rename to itemis.create.examples.codegen.multism.cpp/.cproject index 8fb2119a..f4072848 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/.cproject +++ b/itemis.create.examples.codegen.multism.cpp/.cproject @@ -5,40 +5,38 @@ - + - - - - - - - - - - - + + + + + - - + + + - - - @@ -120,4 +118,4 @@ - + \ No newline at end of file diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/.gitignore b/itemis.create.examples.codegen.multism.cpp/.gitignore similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/.gitignore rename to itemis.create.examples.codegen.multism.cpp/.gitignore diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/.project b/itemis.create.examples.codegen.multism.cpp/.project similarity index 95% rename from com.yakindu.sct.examples.coffeemachine.cpp/.project rename to itemis.create.examples.codegen.multism.cpp/.project index 006a7aa9..f70c0be4 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/.project +++ b/itemis.create.examples.codegen.multism.cpp/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.coffeemachine.cpp + itemis.create.examples.codegen.multism.cpp diff --git a/org.yakindu.sct.examples.basic.eventbuffers/css/style.css b/itemis.create.examples.codegen.multism.cpp/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.eventbuffers/css/style.css rename to itemis.create.examples.codegen.multism.cpp/css/style.css diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/images/console.png b/itemis.create.examples.codegen.multism.cpp/images/console.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/images/console.png rename to itemis.create.examples.codegen.multism.cpp/images/console.png diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/images/light.png b/itemis.create.examples.codegen.multism.cpp/images/light.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/images/light.png rename to itemis.create.examples.codegen.multism.cpp/images/light.png diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/images/light_controller_defsection.png b/itemis.create.examples.codegen.multism.cpp/images/light_controller_defsection.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/images/light_controller_defsection.png rename to itemis.create.examples.codegen.multism.cpp/images/light_controller_defsection.png diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/images/light_controller_machine.png b/itemis.create.examples.codegen.multism.cpp/images/light_controller_machine.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.cpp/images/light_controller_machine.png rename to itemis.create.examples.codegen.multism.cpp/images/light_controller_machine.png diff --git a/org.yakindu.sct.examples.codegen.c/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.multism.cpp/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.codegen.c/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.multism.cpp/images/watch_gears_thumb.jpg diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/index.html b/itemis.create.examples.codegen.multism.cpp/index.html similarity index 96% rename from com.yakindu.sct.examples.codegen.multism.cpp/index.html rename to itemis.create.examples.codegen.multism.cpp/index.html index 0b897497..dbfdfb61 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/index.html +++ b/itemis.create.examples.codegen.multism.cpp/index.html @@ -45,7 +45,7 @@

    Generator Model

    The generator model simply defines the configuration for both state machines. As the state machines use time events, we ensure that a timer service implementation is generated with the TimerService parameter.

    - +

    @@ -59,7 +59,7 @@

    Application Code

    Our application is a simple interactive console with which the user can switch the lights on or off as well as toggle the blink mode. The complete application code is implemented in main.cpp:

    - +

    The most important parts are commented in the main.cpp file. These are the bullet points: diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/metadata.json b/itemis.create.examples.codegen.multism.cpp/metadata.json similarity index 84% rename from com.yakindu.sct.examples.codegen.multism.cpp/metadata.json rename to itemis.create.examples.codegen.multism.cpp/metadata.json index 3a0e2cb0..ceb5ee72 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/metadata.json +++ b/itemis.create.examples.codegen.multism.cpp/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.codegen.multism.cpp", + "id": "itemis.create.examples.codegen.multism.cpp", "title": "C++ Code Generation for Multi State Machines", "author": "itemis AG", "description": "This example demonstrates how to generate C++ code from a multi state machine scenario.", diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/models/cpp.sgen b/itemis.create.examples.codegen.multism.cpp/models/cpp.sgen similarity index 73% rename from com.yakindu.sct.examples.codegen.multism.cpp/models/cpp.sgen rename to itemis.create.examples.codegen.multism.cpp/models/cpp.sgen index be53b90e..40b6f51a 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/models/cpp.sgen +++ b/itemis.create.examples.codegen.multism.cpp/models/cpp.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { - const PROJECT : string = "com.yakindu.sct.examples.codegen.multism.cpp" + const PROJECT : string = "itemis.create.examples.codegen.multism.cpp" const FOLDER : string = "src-gen" diff --git a/com.yakindu.sct.examples.codegen.multism.c/models/light.ysc b/itemis.create.examples.codegen.multism.cpp/models/light.ysc similarity index 98% rename from com.yakindu.sct.examples.codegen.multism.c/models/light.ysc rename to itemis.create.examples.codegen.multism.cpp/models/light.ysc index 089ce962..1a25da3b 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/models/light.ysc +++ b/itemis.create.examples.codegen.multism.cpp/models/light.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.java/models/light_controller.ysc b/itemis.create.examples.codegen.multism.cpp/models/light_controller.ysc similarity index 99% rename from com.yakindu.sct.examples.codegen.multism.java/models/light_controller.ysc rename to itemis.create.examples.codegen.multism.cpp/models/light_controller.ysc index 8a2f112e..7dbf6576 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/models/light_controller.ysc +++ b/itemis.create.examples.codegen.multism.cpp/models/light_controller.ysc @@ -24,7 +24,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/src/main.cpp b/itemis.create.examples.codegen.multism.cpp/src/main.cpp similarity index 96% rename from com.yakindu.sct.examples.codegen.multism.cpp/src/main.cpp rename to itemis.create.examples.codegen.multism.cpp/src/main.cpp index 7b08e501..07029827 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/src/main.cpp +++ b/itemis.create.examples.codegen.multism.cpp/src/main.cpp @@ -107,13 +107,13 @@ int main(int argc, char **argv) { char input = buf[0]; if (input == '1') { /*! Raises the switch_on event in the state machine which causes the corresponding transition to be taken */ - controller->user()->raiseSwitch_on(); + controller->user().raiseSwitch_on(); } else if (input == '0') { /*! Raises the switch_off event in the state machine */ - controller->user()->raiseSwitch_off(); + controller->user().raiseSwitch_off(); } else if (input == '2') { /*! Raises the blink event in the state machine */ - controller->user()->raiseBlink_mode(); + controller->user().raiseBlink_mode(); } numRead = 0; thread readThread(readConsole); diff --git a/org.yakindu.sct.examples.codegen.java/.classpath b/itemis.create.examples.codegen.multism.java/.classpath similarity index 100% rename from org.yakindu.sct.examples.codegen.java/.classpath rename to itemis.create.examples.codegen.multism.java/.classpath diff --git a/org.yakindu.sct.examples.codegen.java/.gitignore b/itemis.create.examples.codegen.multism.java/.gitignore similarity index 100% rename from org.yakindu.sct.examples.codegen.java/.gitignore rename to itemis.create.examples.codegen.multism.java/.gitignore diff --git a/com.yakindu.sct.examples.codegen.multism.java/.project b/itemis.create.examples.codegen.multism.java/.project similarity index 92% rename from com.yakindu.sct.examples.codegen.multism.java/.project rename to itemis.create.examples.codegen.multism.java/.project index 1caeb3f2..1ffa5eb7 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/.project +++ b/itemis.create.examples.codegen.multism.java/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.codegen.multism.java + itemis.create.examples.codegen.multism.java diff --git a/org.yakindu.sct.examples.basic.eventdriven/css/style.css b/itemis.create.examples.codegen.multism.java/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.eventdriven/css/style.css rename to itemis.create.examples.codegen.multism.java/css/style.css diff --git a/com.yakindu.sct.examples.codegen.multism.java/images/console.png b/itemis.create.examples.codegen.multism.java/images/console.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/images/console.png rename to itemis.create.examples.codegen.multism.java/images/console.png diff --git a/com.yakindu.sct.examples.codegen.multism.java/images/light.png b/itemis.create.examples.codegen.multism.java/images/light.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/images/light.png rename to itemis.create.examples.codegen.multism.java/images/light.png diff --git a/com.yakindu.sct.examples.codegen.multism.java/images/light_controller_defsection.png b/itemis.create.examples.codegen.multism.java/images/light_controller_defsection.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/images/light_controller_defsection.png rename to itemis.create.examples.codegen.multism.java/images/light_controller_defsection.png diff --git a/com.yakindu.sct.examples.codegen.multism.java/images/light_controller_machine.png b/itemis.create.examples.codegen.multism.java/images/light_controller_machine.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.java/images/light_controller_machine.png rename to itemis.create.examples.codegen.multism.java/images/light_controller_machine.png diff --git a/org.yakindu.sct.examples.codegen.cpp/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.multism.java/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.multism.java/images/watch_gears_thumb.jpg diff --git a/com.yakindu.sct.examples.codegen.multism.java/index.html b/itemis.create.examples.codegen.multism.java/index.html similarity index 95% rename from com.yakindu.sct.examples.codegen.multism.java/index.html rename to itemis.create.examples.codegen.multism.java/index.html index f2e9de09..27535728 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/index.html +++ b/itemis.create.examples.codegen.multism.java/index.html @@ -45,7 +45,7 @@

    Generator Model

    The generator model simply defines the configuration for both state machines. As the state machines use time events, we ensure that a timer service implementation is generated with the TimerService parameter.

    - +

    @@ -59,7 +59,7 @@

    Application Code

    Our application is a simple interactive console with which the user can switch the lights on or off as well as toggle the blink mode. The complete application code is implemented in Main.java:

    - +

    The most important parts are commented in the Main.java file. These are the bullet points: diff --git a/com.yakindu.sct.examples.codegen.multism.java/metadata.json b/itemis.create.examples.codegen.multism.java/metadata.json similarity index 84% rename from com.yakindu.sct.examples.codegen.multism.java/metadata.json rename to itemis.create.examples.codegen.multism.java/metadata.json index 0f35ce5a..6fc3e9bf 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/metadata.json +++ b/itemis.create.examples.codegen.multism.java/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.codegen.multism.java", + "id": "itemis.create.examples.codegen.multism.java", "title": "Java Code Generation for Multi State Machines", "author": "itemis AG", "description": "This example demonstrates how to generate Java code from a multi state machine scenario.", diff --git a/com.yakindu.sct.examples.codegen.multism.java/models/java.sgen b/itemis.create.examples.codegen.multism.java/models/java.sgen similarity index 61% rename from com.yakindu.sct.examples.codegen.multism.java/models/java.sgen rename to itemis.create.examples.codegen.multism.java/models/java.sgen index c2a4feb9..a99ef459 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/models/java.sgen +++ b/itemis.create.examples.codegen.multism.java/models/java.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::java { +GeneratorModel for create::java { - const PROJECT : string = "com.yakindu.sct.examples.codegen.multism.java" + const PROJECT : string = "itemis.create.examples.codegen.multism.java" const FOLDER : string = "src-gen" @@ -12,7 +12,7 @@ GeneratorModel for yakindu::java { libraryTargetFolder = FOLDER } feature Naming { - basePackage = "com.yakindu.sct.examples.codegen.multism.java.controller" + basePackage = "itemis.create.examples.codegen.multism.java.controller" } feature GeneralFeatures { TimerService = true @@ -27,7 +27,7 @@ GeneratorModel for yakindu::java { libraryTargetFolder = FOLDER } feature Naming { - basePackage = "com.yakindu.sct.examples.codegen.multism.java.light" + basePackage = "itemis.create.examples.codegen.multism.java.light" } } } \ No newline at end of file diff --git a/com.yakindu.sct.examples.codegen.multism.python/models/light.ysc b/itemis.create.examples.codegen.multism.java/models/light.ysc similarity index 98% rename from com.yakindu.sct.examples.codegen.multism.python/models/light.ysc rename to itemis.create.examples.codegen.multism.java/models/light.ysc index 089ce962..1a25da3b 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/models/light.ysc +++ b/itemis.create.examples.codegen.multism.java/models/light.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.python/models/light_controller.ysc b/itemis.create.examples.codegen.multism.java/models/light_controller.ysc similarity index 99% rename from com.yakindu.sct.examples.codegen.multism.python/models/light_controller.ysc rename to itemis.create.examples.codegen.multism.java/models/light_controller.ysc index 8a2f112e..7dbf6576 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/models/light_controller.ysc +++ b/itemis.create.examples.codegen.multism.java/models/light_controller.ysc @@ -24,7 +24,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.java/src/com/yakindu/sct/examples/codegen/multism/java/Main.java b/itemis.create.examples.codegen.multism.java/src/itemis/create/examples/codegen/multism/java/Main.java similarity index 88% rename from com.yakindu.sct.examples.codegen.multism.java/src/com/yakindu/sct/examples/codegen/multism/java/Main.java rename to itemis.create.examples.codegen.multism.java/src/itemis/create/examples/codegen/multism/java/Main.java index 01f14b55..4b762b0a 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/src/com/yakindu/sct/examples/codegen/multism/java/Main.java +++ b/itemis.create.examples.codegen.multism.java/src/itemis/create/examples/codegen/multism/java/Main.java @@ -1,10 +1,10 @@ -package com.yakindu.sct.examples.codegen.multism.java; +package itemis.create.examples.codegen.multism.java; import java.util.Scanner; -import com.yakindu.core.TimerService; -import com.yakindu.sct.examples.codegen.multism.java.controller.LightController; -import com.yakindu.sct.examples.codegen.multism.java.light.Light; +import itemis.create.core.TimerService; +import itemis.create.examples.codegen.multism.java.controller.LightController; +import itemis.create.examples.codegen.multism.java.light.Light; public class Main { diff --git a/com.yakindu.sct.examples.codegen.multism.python/.gitignore b/itemis.create.examples.codegen.multism.python/.gitignore similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/.gitignore rename to itemis.create.examples.codegen.multism.python/.gitignore diff --git a/com.yakindu.sct.examples.codegen.multism.python/.project b/itemis.create.examples.codegen.multism.python/.project similarity index 89% rename from com.yakindu.sct.examples.codegen.multism.python/.project rename to itemis.create.examples.codegen.multism.python/.project index 1eb3ef9e..27a9ecb5 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/.project +++ b/itemis.create.examples.codegen.multism.python/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.codegen.multism.python + itemis.create.examples.codegen.multism.python diff --git a/com.yakindu.sct.examples.codegen.multism.python/.pydevproject b/itemis.create.examples.codegen.multism.python/.pydevproject similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/.pydevproject rename to itemis.create.examples.codegen.multism.python/.pydevproject diff --git a/org.yakindu.sct.examples.basic.hierarchical/css/style.css b/itemis.create.examples.codegen.multism.python/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.hierarchical/css/style.css rename to itemis.create.examples.codegen.multism.python/css/style.css diff --git a/com.yakindu.sct.examples.codegen.multism.python/images/console.png b/itemis.create.examples.codegen.multism.python/images/console.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/images/console.png rename to itemis.create.examples.codegen.multism.python/images/console.png diff --git a/com.yakindu.sct.examples.codegen.multism.python/images/light.png b/itemis.create.examples.codegen.multism.python/images/light.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/images/light.png rename to itemis.create.examples.codegen.multism.python/images/light.png diff --git a/com.yakindu.sct.examples.codegen.multism.python/images/light_controller_defsection.png b/itemis.create.examples.codegen.multism.python/images/light_controller_defsection.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/images/light_controller_defsection.png rename to itemis.create.examples.codegen.multism.python/images/light_controller_defsection.png diff --git a/com.yakindu.sct.examples.codegen.multism.python/images/light_controller_machine.png b/itemis.create.examples.codegen.multism.python/images/light_controller_machine.png similarity index 100% rename from com.yakindu.sct.examples.codegen.multism.python/images/light_controller_machine.png rename to itemis.create.examples.codegen.multism.python/images/light_controller_machine.png diff --git a/org.yakindu.sct.examples.codegen.java/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.multism.python/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.codegen.java/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.multism.python/images/watch_gears_thumb.jpg diff --git a/com.yakindu.sct.examples.codegen.multism.python/index.html b/itemis.create.examples.codegen.multism.python/index.html similarity index 96% rename from com.yakindu.sct.examples.codegen.multism.python/index.html rename to itemis.create.examples.codegen.multism.python/index.html index f45a780d..804bbb24 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/index.html +++ b/itemis.create.examples.codegen.multism.python/index.html @@ -45,7 +45,7 @@

    Generator Model

    The generator model simply defines the configuration for both state machines. As the state machines use time events, we ensure that a timer service implementation is generated with the TimerService parameter.

    - +

    @@ -59,7 +59,7 @@

    Application Code

    Our application is a simple interactive console with which the user can switch the lights on or off as well as toggle the blink mode. The complete application code is implemented in main.py:

    - +

    The most important parts are commented in the main.py file. These are the bullet points: diff --git a/com.yakindu.sct.examples.codegen.multism.python/metadata.json b/itemis.create.examples.codegen.multism.python/metadata.json similarity index 88% rename from com.yakindu.sct.examples.codegen.multism.python/metadata.json rename to itemis.create.examples.codegen.multism.python/metadata.json index ee3dbcb7..47ebeb50 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/metadata.json +++ b/itemis.create.examples.codegen.multism.python/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.codegen.multism.python", + "id": "itemis.create.examples.codegen.multism.python", "title": "Python Code Generation for Multi State Machines", "author": "itemis AG", "description": "This example demonstrates how to generate Python code from a multi state machine scenario.", diff --git a/com.yakindu.sct.examples.codegen.multism.java/models/light.ysc b/itemis.create.examples.codegen.multism.python/models/light.ysc similarity index 98% rename from com.yakindu.sct.examples.codegen.multism.java/models/light.ysc rename to itemis.create.examples.codegen.multism.python/models/light.ysc index 089ce962..1a25da3b 100644 --- a/com.yakindu.sct.examples.codegen.multism.java/models/light.ysc +++ b/itemis.create.examples.codegen.multism.python/models/light.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.c/models/light_controller.ysc b/itemis.create.examples.codegen.multism.python/models/light_controller.ysc similarity index 99% rename from com.yakindu.sct.examples.codegen.multism.c/models/light_controller.ysc rename to itemis.create.examples.codegen.multism.python/models/light_controller.ysc index 8a2f112e..7dbf6576 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/models/light_controller.ysc +++ b/itemis.create.examples.codegen.multism.python/models/light_controller.ysc @@ -24,7 +24,7 @@ - + diff --git a/com.yakindu.sct.examples.codegen.multism.python/models/python.sgen b/itemis.create.examples.codegen.multism.python/models/python.sgen similarity index 77% rename from com.yakindu.sct.examples.codegen.multism.python/models/python.sgen rename to itemis.create.examples.codegen.multism.python/models/python.sgen index 9d9324d5..468c0a21 100644 --- a/com.yakindu.sct.examples.codegen.multism.python/models/python.sgen +++ b/itemis.create.examples.codegen.multism.python/models/python.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::python { +GeneratorModel for create::python { - const PROJECT : string = "com.yakindu.sct.examples.codegen.multism.python" + const PROJECT : string = "itemis.create.examples.codegen.multism.python" const FOLDER : string = "src" diff --git a/org.yakindu.sct.examples.codegen.python/.gitignore b/itemis.create.examples.codegen.python/.gitignore similarity index 100% rename from org.yakindu.sct.examples.codegen.python/.gitignore rename to itemis.create.examples.codegen.python/.gitignore diff --git a/org.yakindu.sct.examples.codegen.python/.project b/itemis.create.examples.codegen.python/.project similarity index 90% rename from org.yakindu.sct.examples.codegen.python/.project rename to itemis.create.examples.codegen.python/.project index b0ad7f02..6b56dc0f 100644 --- a/org.yakindu.sct.examples.codegen.python/.project +++ b/itemis.create.examples.codegen.python/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.codegen.python + itemis.create.examples.codegen.python diff --git a/org.yakindu.sct.examples.codegen.python/.pydevproject b/itemis.create.examples.codegen.python/.pydevproject similarity index 100% rename from org.yakindu.sct.examples.codegen.python/.pydevproject rename to itemis.create.examples.codegen.python/.pydevproject diff --git a/org.yakindu.sct.examples.basic.historystates/css/style.css b/itemis.create.examples.codegen.python/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.historystates/css/style.css rename to itemis.create.examples.codegen.python/css/style.css diff --git a/org.yakindu.sct.examples.codegen.python/images/console.png b/itemis.create.examples.codegen.python/images/console.png similarity index 100% rename from org.yakindu.sct.examples.codegen.python/images/console.png rename to itemis.create.examples.codegen.python/images/console.png diff --git a/org.yakindu.sct.examples.codegen.python/images/content-assist.gif b/itemis.create.examples.codegen.python/images/content-assist.gif similarity index 100% rename from org.yakindu.sct.examples.codegen.python/images/content-assist.gif rename to itemis.create.examples.codegen.python/images/content-assist.gif diff --git a/org.yakindu.sct.examples.codegen.python/images/model.png b/itemis.create.examples.codegen.python/images/model.png similarity index 100% rename from org.yakindu.sct.examples.codegen.python/images/model.png rename to itemis.create.examples.codegen.python/images/model.png diff --git a/org.yakindu.sct.examples.codegen.python/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.python/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.codegen.python/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.python/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.codegen.python/index.html b/itemis.create.examples.codegen.python/index.html similarity index 92% rename from org.yakindu.sct.examples.codegen.python/index.html rename to itemis.create.examples.codegen.python/index.html index d067cbe8..52645571 100644 --- a/org.yakindu.sct.examples.codegen.python/index.html +++ b/itemis.create.examples.codegen.python/index.html @@ -27,7 +27,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    The generator model defines where the code should be generated into, and enables the generation of a default timer service. Besides setting up the target location, the generator model allows you to adjust several aspects of the generated code like naming, license comments or function inlining. Press [CTRL]+[SPACE] to get a list of available features. For more information, please refer to our documentation. @@ -42,7 +42,7 @@

    Invoking Code Generation

    The Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model @@ -52,7 +52,7 @@

    The Example Application

    - +

    The most important parts are commented in the main.py file. These are the bullet points: diff --git a/org.yakindu.sct.examples.codegen.python/metadata.json b/itemis.create.examples.codegen.python/metadata.json similarity index 88% rename from org.yakindu.sct.examples.codegen.python/metadata.json rename to itemis.create.examples.codegen.python/metadata.json index dc9bccf1..fcce76f1 100644 --- a/org.yakindu.sct.examples.codegen.python/metadata.json +++ b/itemis.create.examples.codegen.python/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.codegen.python", + "id": "itemis.create.examples.codegen.python", "title": "Python Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate Python code from a statechart.", diff --git a/org.yakindu.sct.examples.codegen.python/models/light_switch.ysc b/itemis.create.examples.codegen.python/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.codegen.python/models/light_switch.ysc rename to itemis.create.examples.codegen.python/models/light_switch.ysc index 7e46f0ca..7519822b 100644 --- a/org.yakindu.sct.examples.codegen.python/models/light_switch.ysc +++ b/itemis.create.examples.codegen.python/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.python/models/python.sgen b/itemis.create.examples.codegen.python/models/python.sgen similarity index 78% rename from org.yakindu.sct.examples.codegen.python/models/python.sgen rename to itemis.create.examples.codegen.python/models/python.sgen index 595423ba..429e783a 100644 --- a/org.yakindu.sct.examples.codegen.python/models/python.sgen +++ b/itemis.create.examples.codegen.python/models/python.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::python { +GeneratorModel for create::python { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.codegen.python" + targetProject = "itemis.create.examples.codegen.python" targetFolder = "src" } /* Generate a default timer service implementation */ diff --git a/org.yakindu.sct.examples.codegen.scxml/.project b/itemis.create.examples.codegen.scxml/.project similarity index 87% rename from org.yakindu.sct.examples.codegen.scxml/.project rename to itemis.create.examples.codegen.scxml/.project index acdcb00b..2646943b 100644 --- a/org.yakindu.sct.examples.codegen.scxml/.project +++ b/itemis.create.examples.codegen.scxml/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.codegen.scxml + itemis.create.examples.codegen.scxml diff --git a/org.yakindu.sct.examples.basic.orthogonality/css/style.css b/itemis.create.examples.codegen.scxml/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.orthogonality/css/style.css rename to itemis.create.examples.codegen.scxml/css/style.css diff --git a/org.yakindu.sct.examples.codegen.scxml/images/content-assist.gif b/itemis.create.examples.codegen.scxml/images/content-assist.gif similarity index 100% rename from org.yakindu.sct.examples.codegen.scxml/images/content-assist.gif rename to itemis.create.examples.codegen.scxml/images/content-assist.gif diff --git a/org.yakindu.sct.examples.codegen.scxml/images/model.png b/itemis.create.examples.codegen.scxml/images/model.png similarity index 100% rename from org.yakindu.sct.examples.codegen.scxml/images/model.png rename to itemis.create.examples.codegen.scxml/images/model.png diff --git a/org.yakindu.sct.examples.codegen.scxml/images/watch_gears_thumb.jpg b/itemis.create.examples.codegen.scxml/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.codegen.scxml/images/watch_gears_thumb.jpg rename to itemis.create.examples.codegen.scxml/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.codegen.scxml/index.html b/itemis.create.examples.codegen.scxml/index.html similarity index 92% rename from org.yakindu.sct.examples.codegen.scxml/index.html rename to itemis.create.examples.codegen.scxml/index.html index f40bbc70..38eb65cb 100644 --- a/org.yakindu.sct.examples.codegen.scxml/index.html +++ b/itemis.create.examples.codegen.scxml/index.html @@ -27,7 +27,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    This is the simplest possible generator model. Press [CTRL]+[SPACE] to get a list of available features. For more information, please refer to our documentation. @@ -43,7 +43,7 @@

    Invoking Code Generation

    The Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model diff --git a/org.yakindu.sct.examples.codegen.scxml/metadata.json b/itemis.create.examples.codegen.scxml/metadata.json similarity index 83% rename from org.yakindu.sct.examples.codegen.scxml/metadata.json rename to itemis.create.examples.codegen.scxml/metadata.json index 772ac68b..dcdf1abf 100644 --- a/org.yakindu.sct.examples.codegen.scxml/metadata.json +++ b/itemis.create.examples.codegen.scxml/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.codegen.scxml", + "id": "itemis.create.examples.codegen.scxml", "title": "SCXML Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate SCXML code from a statechart.", diff --git a/org.yakindu.sct.examples.codegen.scxml/models/light_switch.ysc b/itemis.create.examples.codegen.scxml/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.codegen.scxml/models/light_switch.ysc rename to itemis.create.examples.codegen.scxml/models/light_switch.ysc index 58ddc405..cccd443c 100644 --- a/org.yakindu.sct.examples.codegen.scxml/models/light_switch.ysc +++ b/itemis.create.examples.codegen.scxml/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.codegen.scxml/models/scxml.sgen b/itemis.create.examples.codegen.scxml/models/scxml.sgen similarity index 71% rename from org.yakindu.sct.examples.codegen.scxml/models/scxml.sgen rename to itemis.create.examples.codegen.scxml/models/scxml.sgen index b96d785d..8654db6c 100644 --- a/org.yakindu.sct.examples.codegen.scxml/models/scxml.sgen +++ b/itemis.create.examples.codegen.scxml/models/scxml.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::scxml { +GeneratorModel for create::scxml { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.codegen.scxml" + targetProject = "itemis.create.examples.codegen.scxml" targetFolder = "src-gen" } } diff --git a/itemis.create.examples.codegen.scxml/src-gen/LightSwitch.scxml b/itemis.create.examples.codegen.scxml/src-gen/LightSwitch.scxml new file mode 100644 index 00000000..ec5b5f3a --- /dev/null +++ b/itemis.create.examples.codegen.scxml/src-gen/LightSwitch.scxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.yakindu.sct.examples.coffeemachine.c/.cproject b/itemis.create.examples.coffeemachine.c/.cproject similarity index 87% rename from com.yakindu.sct.examples.coffeemachine.c/.cproject rename to itemis.create.examples.coffeemachine.c/.cproject index ac74f1df..8ba9040d 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/.cproject +++ b/itemis.create.examples.coffeemachine.c/.cproject @@ -5,7 +5,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -24,16 +24,16 @@ - - - @@ -52,7 +52,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -71,12 +71,12 @@ - - @@ -118,4 +118,4 @@ - + \ No newline at end of file diff --git a/com.yakindu.sct.examples.coffeemachine.c/.gitignore b/itemis.create.examples.coffeemachine.c/.gitignore similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/.gitignore rename to itemis.create.examples.coffeemachine.c/.gitignore diff --git a/com.yakindu.sct.examples.coffeemachine.c/.project b/itemis.create.examples.coffeemachine.c/.project similarity index 95% rename from com.yakindu.sct.examples.coffeemachine.c/.project rename to itemis.create.examples.coffeemachine.c/.project index c3792b49..9eaaa5c1 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/.project +++ b/itemis.create.examples.coffeemachine.c/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.coffeemachine.c + itemis.create.examples.coffeemachine.c diff --git a/org.yakindu.sct.examples.basic.supersteps/css/style.css b/itemis.create.examples.coffeemachine.c/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.supersteps/css/style.css rename to itemis.create.examples.coffeemachine.c/css/style.css diff --git a/com.yakindu.sct.examples.coffeemachine.c/images/CodeCompletion.png b/itemis.create.examples.coffeemachine.c/images/CodeCompletion.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/images/CodeCompletion.png rename to itemis.create.examples.coffeemachine.c/images/CodeCompletion.png diff --git a/com.yakindu.sct.examples.coffeemachine.c/images/CoffeeMachine_model.png b/itemis.create.examples.coffeemachine.c/images/CoffeeMachine_model.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/images/CoffeeMachine_model.png rename to itemis.create.examples.coffeemachine.c/images/CoffeeMachine_model.png diff --git a/com.yakindu.sct.examples.coffeemachine.c/images/coffee_machine.jpg b/itemis.create.examples.coffeemachine.c/images/coffee_machine.jpg similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/images/coffee_machine.jpg rename to itemis.create.examples.coffeemachine.c/images/coffee_machine.jpg diff --git a/com.yakindu.sct.examples.coffeemachine.c/images/coffee_machine_thumb.jpg b/itemis.create.examples.coffeemachine.c/images/coffee_machine_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/images/coffee_machine_thumb.jpg rename to itemis.create.examples.coffeemachine.c/images/coffee_machine_thumb.jpg diff --git a/com.yakindu.sct.examples.coffeemachine.c/images/console.png b/itemis.create.examples.coffeemachine.c/images/console.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/images/console.png rename to itemis.create.examples.coffeemachine.c/images/console.png diff --git a/com.yakindu.sct.examples.coffeemachine.c/index.html b/itemis.create.examples.coffeemachine.c/index.html similarity index 96% rename from com.yakindu.sct.examples.coffeemachine.c/index.html rename to itemis.create.examples.coffeemachine.c/index.html index 756efbe6..b5c083b2 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/index.html +++ b/itemis.create.examples.coffeemachine.c/index.html @@ -8,9 +8,10 @@
    + DISCLAIMER: This example only work with UNIX based systems due to the nature of Eclipse console

    [Pro] Coffee Machine with C integration

    - This is a comprehensive example for the deep integration of YAKINDU + This is a comprehensive example for the deep integration of CREATE statecharts with manually written C code. The example is implemented as a simple command line tool. It makes use of POSIX threads. So you need a compiler tool chain and a 'pthread' library to build an run the example. diff --git a/com.yakindu.sct.examples.coffeemachine.c/main.c b/itemis.create.examples.coffeemachine.c/main.c similarity index 99% rename from com.yakindu.sct.examples.coffeemachine.c/main.c rename to itemis.create.examples.coffeemachine.c/main.c index c3d070e5..12c2f8d4 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/main.c +++ b/itemis.create.examples.coffeemachine.c/main.c @@ -8,7 +8,7 @@ #include "src-gen/CoffeeMachine.h" #include "src-gen/sc_timer_service.h" -/*! \file Implementation of the main function and setup of the virtual YAKINDU Coffee Maker. +/*! \file Implementation of the main function and setup of the virtual CREATE Coffee Maker. * It includes everything to setup and run the example. * The example applies a cycle based execution model. */ diff --git a/com.yakindu.sct.examples.coffeemachine.c/metadata.json b/itemis.create.examples.coffeemachine.c/metadata.json similarity index 70% rename from com.yakindu.sct.examples.coffeemachine.c/metadata.json rename to itemis.create.examples.coffeemachine.c/metadata.json index 9485484f..b81485be 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/metadata.json +++ b/itemis.create.examples.coffeemachine.c/metadata.json @@ -1,8 +1,8 @@ { - "id": "com.yakindu.sct.examples.coffeemachine.c", + "id": "itemis.create.examples.coffeemachine.c", "title": "Coffee Machine (Deep C)", "author": "itemis AG", - "description": "This is a comprehensive example for the deep integration of YAKINDU statecharts with manually written C code. The example is implemented as a simple command line tool.", + "description": "This is a comprehensive example for the deep integration of CREATE statecharts with manually written C code. The example is implemented as a simple command line tool.", "previewImage": "coffee_machine_thumb.jpg", "category": [ "professional", diff --git a/com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.sgen b/itemis.create.examples.coffeemachine.c/model/CoffeeMachine.sgen similarity index 71% rename from com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.sgen rename to itemis.create.examples.coffeemachine.c/model/CoffeeMachine.sgen index d718fcd2..24a5a542 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.sgen +++ b/itemis.create.examples.coffeemachine.c/model/CoffeeMachine.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { - var project : string = "com.yakindu.sct.examples.coffeemachine.c" + var project : string = "itemis.create.examples.coffeemachine.c" statechart CoffeeMachine { diff --git a/com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.ysc b/itemis.create.examples.coffeemachine.c/model/CoffeeMachine.ysc similarity index 98% rename from com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.ysc rename to itemis.create.examples.coffeemachine.c/model/CoffeeMachine.ysc index 35e8838b..d491bca5 100644 --- a/com.yakindu.sct.examples.coffeemachine.c/model/CoffeeMachine.ysc +++ b/itemis.create.examples.coffeemachine.c/model/CoffeeMachine.ysc @@ -11,7 +11,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -342,11 +342,11 @@ - + - + @@ -504,7 +504,7 @@ - + @@ -578,7 +578,7 @@ - + diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/cm_hmi.c b/itemis.create.examples.coffeemachine.c/src/cm_hmi.c similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/cm_hmi.c rename to itemis.create.examples.coffeemachine.c/src/cm_hmi.c diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/cm_hmi.h b/itemis.create.examples.coffeemachine.c/src/cm_hmi.h similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/cm_hmi.h rename to itemis.create.examples.coffeemachine.c/src/cm_hmi.h diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/cm_trace.c b/itemis.create.examples.coffeemachine.c/src/cm_trace.c similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/cm_trace.c rename to itemis.create.examples.coffeemachine.c/src/cm_trace.c diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/cm_trace.h b/itemis.create.examples.coffeemachine.c/src/cm_trace.h similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/cm_trace.h rename to itemis.create.examples.coffeemachine.c/src/cm_trace.h diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/coffee_machine.c b/itemis.create.examples.coffeemachine.c/src/coffee_machine.c similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/coffee_machine.c rename to itemis.create.examples.coffeemachine.c/src/coffee_machine.c diff --git a/com.yakindu.sct.examples.coffeemachine.c/src/coffee_machine.h b/itemis.create.examples.coffeemachine.c/src/coffee_machine.h similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/src/coffee_machine.h rename to itemis.create.examples.coffeemachine.c/src/coffee_machine.h diff --git a/com.yakindu.sct.examples.coffeemachine.c/tests/CoffeeMachineTest.sctunit b/itemis.create.examples.coffeemachine.c/tests/CoffeeMachineTest.sctunit similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.c/tests/CoffeeMachineTest.sctunit rename to itemis.create.examples.coffeemachine.c/tests/CoffeeMachineTest.sctunit diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/.cproject b/itemis.create.examples.coffeemachine.cpp/.cproject similarity index 77% rename from com.yakindu.sct.examples.coffeemachine.cpp/.cproject rename to itemis.create.examples.coffeemachine.cpp/.cproject index 073c5103..59abc5b0 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/.cproject +++ b/itemis.create.examples.coffeemachine.cpp/.cproject @@ -5,44 +5,42 @@ - + - - - - - - - - @@ -53,7 +51,7 @@ - + diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/.gitignore b/itemis.create.examples.coffeemachine.cpp/.gitignore similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/.gitignore rename to itemis.create.examples.coffeemachine.cpp/.gitignore diff --git a/com.yakindu.sct.examples.codegen.multism.cpp/.project b/itemis.create.examples.coffeemachine.cpp/.project similarity index 95% rename from com.yakindu.sct.examples.codegen.multism.cpp/.project rename to itemis.create.examples.coffeemachine.cpp/.project index d9bf1960..103ff66a 100644 --- a/com.yakindu.sct.examples.codegen.multism.cpp/.project +++ b/itemis.create.examples.coffeemachine.cpp/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.codegen.multism.cpp + itemis.create.examples.coffeemachine.cpp diff --git a/org.yakindu.sct.examples.basic.tutorial/css/style.css b/itemis.create.examples.coffeemachine.cpp/css/style.css similarity index 100% rename from org.yakindu.sct.examples.basic.tutorial/css/style.css rename to itemis.create.examples.coffeemachine.cpp/css/style.css diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/images/CoffeeMachineCpp_0.png b/itemis.create.examples.coffeemachine.cpp/images/CoffeeMachineCpp_0.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/images/CoffeeMachineCpp_0.png rename to itemis.create.examples.coffeemachine.cpp/images/CoffeeMachineCpp_0.png diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/images/coffee_machine.jpg b/itemis.create.examples.coffeemachine.cpp/images/coffee_machine.jpg similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/images/coffee_machine.jpg rename to itemis.create.examples.coffeemachine.cpp/images/coffee_machine.jpg diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/images/coffee_machine_thumb.jpg b/itemis.create.examples.coffeemachine.cpp/images/coffee_machine_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/images/coffee_machine_thumb.jpg rename to itemis.create.examples.coffeemachine.cpp/images/coffee_machine_thumb.jpg diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/images/functions.png b/itemis.create.examples.coffeemachine.cpp/images/functions.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/images/functions.png rename to itemis.create.examples.coffeemachine.cpp/images/functions.png diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/images/simulationview.png b/itemis.create.examples.coffeemachine.cpp/images/simulationview.png similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/images/simulationview.png rename to itemis.create.examples.coffeemachine.cpp/images/simulationview.png diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/index.html b/itemis.create.examples.coffeemachine.cpp/index.html similarity index 96% rename from com.yakindu.sct.examples.coffeemachine.cpp/index.html rename to itemis.create.examples.coffeemachine.cpp/index.html index c0891ede..2a25b7db 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/index.html +++ b/itemis.create.examples.coffeemachine.cpp/index.html @@ -10,7 +10,7 @@

    [Pro] Coffee Machine with C++ integration

    - This is a example for the deep C++ integration of YAKINDU + This is a example for the deep C++ integration of CREATE statecharts. It shows how C++ classes can be used as variables and is based on the C example:

    Model

    The statechart consists of two diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/main.cpp b/itemis.create.examples.coffeemachine.cpp/main.cpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/main.cpp rename to itemis.create.examples.coffeemachine.cpp/main.cpp diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/metadata.json b/itemis.create.examples.coffeemachine.cpp/metadata.json similarity index 81% rename from com.yakindu.sct.examples.coffeemachine.cpp/metadata.json rename to itemis.create.examples.coffeemachine.cpp/metadata.json index 1ba77458..bd914d91 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/metadata.json +++ b/itemis.create.examples.coffeemachine.cpp/metadata.json @@ -1,8 +1,8 @@ { - "id": "com.yakindu.sct.examples.coffeemachine.cpp", + "id": "itemis.create.examples.coffeemachine.cpp", "title": "Coffee Machine (Deep C++)", "author": "itemis AG", - "description": "This is a comprehensive example for the deep C++ integration of YAKINDU statecharts.", + "description": "This is a comprehensive example for the deep C++ integration of CREATE statecharts.", "previewImage": "coffee_machine_thumb.jpg", "category": [ "professional", diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen b/itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen similarity index 68% rename from com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen rename to itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen index 29e6944c..ab65399c 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen +++ b/itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { statechart CoffeeMachineCpp { feature Outlet { - targetProject = "com.yakindu.sct.examples.coffeemachine.cpp" + targetProject = "itemis.create.examples.coffeemachine.cpp" targetFolder = "src-gen" } diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc b/itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc similarity index 98% rename from com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc rename to itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc index 4e4a4df4..e341547f 100644 --- a/com.yakindu.sct.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc +++ b/itemis.create.examples.coffeemachine.cpp/model/CoffeeMachineCpp.ysc @@ -8,7 +8,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -323,11 +323,11 @@ - + - + @@ -376,11 +376,11 @@ - + - + @@ -474,7 +474,7 @@ - + @@ -578,7 +578,7 @@ - + diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CMHMI.cpp b/itemis.create.examples.coffeemachine.cpp/src/CMHMI.cpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CMHMI.cpp rename to itemis.create.examples.coffeemachine.cpp/src/CMHMI.cpp diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CMHMI.hpp b/itemis.create.examples.coffeemachine.cpp/src/CMHMI.hpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CMHMI.hpp rename to itemis.create.examples.coffeemachine.cpp/src/CMHMI.hpp diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CMTracing.cpp b/itemis.create.examples.coffeemachine.cpp/src/CMTracing.cpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CMTracing.cpp rename to itemis.create.examples.coffeemachine.cpp/src/CMTracing.cpp diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CMTracing.h b/itemis.create.examples.coffeemachine.cpp/src/CMTracing.h similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CMTracing.h rename to itemis.create.examples.coffeemachine.cpp/src/CMTracing.h diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CoffeeMachine.cpp b/itemis.create.examples.coffeemachine.cpp/src/CoffeeMachine.cpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CoffeeMachine.cpp rename to itemis.create.examples.coffeemachine.cpp/src/CoffeeMachine.cpp diff --git a/com.yakindu.sct.examples.coffeemachine.cpp/src/CoffeeMachine.hpp b/itemis.create.examples.coffeemachine.cpp/src/CoffeeMachine.hpp similarity index 100% rename from com.yakindu.sct.examples.coffeemachine.cpp/src/CoffeeMachine.hpp rename to itemis.create.examples.coffeemachine.cpp/src/CoffeeMachine.hpp diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/.cproject b/itemis.create.examples.digitalwatch.cpp.arduino/.cproject similarity index 90% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/.cproject rename to itemis.create.examples.digitalwatch.cpp.arduino/.cproject index 2aca40bc..e3e50b7b 100644 --- a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/.cproject +++ b/itemis.create.examples.digitalwatch.cpp.arduino/.cproject @@ -24,9 +24,9 @@ - - - + + + @@ -37,9 +37,9 @@ - - - + + + @@ -50,9 +50,9 @@ - - - + + + diff --git a/com.yakindu.sct.examples.zowi.cpp.arduino/.gitignore b/itemis.create.examples.digitalwatch.cpp.arduino/.gitignore similarity index 100% rename from com.yakindu.sct.examples.zowi.cpp.arduino/.gitignore rename to itemis.create.examples.digitalwatch.cpp.arduino/.gitignore diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/.project b/itemis.create.examples.digitalwatch.cpp.arduino/.project similarity index 96% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/.project rename to itemis.create.examples.digitalwatch.cpp.arduino/.project index 2c14d0cb..0a3c3133 100644 --- a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/.project +++ b/itemis.create.examples.digitalwatch.cpp.arduino/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.digitalwatch.cpp.arduino + itemis.create.examples.digitalwatch.cpp.arduino diff --git a/org.yakindu.sct.examples.codegen.c/css/style.css b/itemis.create.examples.digitalwatch.cpp.arduino/css/style.css similarity index 100% rename from org.yakindu.sct.examples.codegen.c/css/style.css rename to itemis.create.examples.digitalwatch.cpp.arduino/css/style.css diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/images/DigitalWatch.jpg b/itemis.create.examples.digitalwatch.cpp.arduino/images/DigitalWatch.jpg similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/images/DigitalWatch.jpg rename to itemis.create.examples.digitalwatch.cpp.arduino/images/DigitalWatch.jpg diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/images/digital_watch_thumb.jpg b/itemis.create.examples.digitalwatch.cpp.arduino/images/digital_watch_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/images/digital_watch_thumb.jpg rename to itemis.create.examples.digitalwatch.cpp.arduino/images/digital_watch_thumb.jpg diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/index.html b/itemis.create.examples.digitalwatch.cpp.arduino/index.html similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/index.html rename to itemis.create.examples.digitalwatch.cpp.arduino/index.html diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/main.ino b/itemis.create.examples.digitalwatch.cpp.arduino/main.ino similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/main.ino rename to itemis.create.examples.digitalwatch.cpp.arduino/main.ino diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/metadata.json b/itemis.create.examples.digitalwatch.cpp.arduino/metadata.json similarity index 88% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/metadata.json rename to itemis.create.examples.digitalwatch.cpp.arduino/metadata.json index 36d9a750..77bb0473 100644 --- a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/metadata.json +++ b/itemis.create.examples.digitalwatch.cpp.arduino/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.digitalwatch.cpp.arduino", + "id": "itemis.create.examples.digitalwatch.cpp.arduino", "title": "Arduino - Digital Watch (C++)", "author": "itemis AG", "description": "This digital watch was first designed by David Harel, the founder of the Statecharts Theory. This example shows how to integrate it on an Arduino.", diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen b/itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen similarity index 57% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen rename to itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen index c4dd3c43..52ec3e49 100644 --- a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen +++ b/itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { statechart DigitalWatch { feature Outlet { - targetProject = "org.yakindu.sct.examples.digitalwatch.cpp.arduino" + targetProject = "itemis.create.examples.digitalwatch.cpp.arduino" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc b/itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc similarity index 99% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc rename to itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc index c6c4b469..5fb8a63e 100644 --- a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc +++ b/itemis.create.examples.digitalwatch.cpp.arduino/model/DigitalWatch.ysc @@ -139,7 +139,7 @@ - + @@ -875,7 +875,7 @@ - + @@ -1159,7 +1159,7 @@ - + diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/src/DisplayHandler.cpp b/itemis.create.examples.digitalwatch.cpp.arduino/src/DisplayHandler.cpp similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/src/DisplayHandler.cpp rename to itemis.create.examples.digitalwatch.cpp.arduino/src/DisplayHandler.cpp diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/src/DisplayHandler.h b/itemis.create.examples.digitalwatch.cpp.arduino/src/DisplayHandler.h similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/src/DisplayHandler.h rename to itemis.create.examples.digitalwatch.cpp.arduino/src/DisplayHandler.h diff --git a/org.yakindu.sct.examples.digitalwatch/.classpath b/itemis.create.examples.digitalwatch/.classpath similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/.classpath rename to itemis.create.examples.digitalwatch/.classpath diff --git a/org.yakindu.sct.examples.digitalwatch/.gitignore b/itemis.create.examples.digitalwatch/.gitignore similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/.gitignore rename to itemis.create.examples.digitalwatch/.gitignore diff --git a/org.yakindu.sct.examples.digitalwatch/.project b/itemis.create.examples.digitalwatch/.project similarity index 91% rename from org.yakindu.sct.examples.digitalwatch/.project rename to itemis.create.examples.digitalwatch/.project index 84cba27e..7b42692f 100644 --- a/org.yakindu.sct.examples.digitalwatch/.project +++ b/itemis.create.examples.digitalwatch/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.digitalwatch + itemis.create.examples.digitalwatch diff --git a/org.yakindu.sct.examples.codegen.cpp/css/style.css b/itemis.create.examples.digitalwatch/css/style.css similarity index 100% rename from org.yakindu.sct.examples.codegen.cpp/css/style.css rename to itemis.create.examples.digitalwatch/css/style.css diff --git a/org.yakindu.sct.examples.digitalwatch/images/digital_watch.jpg b/itemis.create.examples.digitalwatch/images/digital_watch.jpg similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/digital_watch.jpg rename to itemis.create.examples.digitalwatch/images/digital_watch.jpg diff --git a/org.yakindu.sct.examples.digitalwatch/images/digital_watch_thumb.jpg b/itemis.create.examples.digitalwatch/images/digital_watch_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/digital_watch_thumb.jpg rename to itemis.create.examples.digitalwatch/images/digital_watch_thumb.jpg diff --git a/org.yakindu.sct.examples.digitalwatch/images/subdiagram.png b/itemis.create.examples.digitalwatch/images/subdiagram.png similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/subdiagram.png rename to itemis.create.examples.digitalwatch/images/subdiagram.png diff --git a/org.yakindu.sct.examples.digitalwatch/images/watch.png b/itemis.create.examples.digitalwatch/images/watch.png similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/watch.png rename to itemis.create.examples.digitalwatch/images/watch.png diff --git a/org.yakindu.sct.examples.digitalwatch/images/watch_declaration.png b/itemis.create.examples.digitalwatch/images/watch_declaration.png similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/watch_declaration.png rename to itemis.create.examples.digitalwatch/images/watch_declaration.png diff --git a/org.yakindu.sct.examples.digitalwatch/images/watch_subdiagrams.png b/itemis.create.examples.digitalwatch/images/watch_subdiagrams.png similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/images/watch_subdiagrams.png rename to itemis.create.examples.digitalwatch/images/watch_subdiagrams.png diff --git a/org.yakindu.sct.examples.digitalwatch/index.html b/itemis.create.examples.digitalwatch/index.html similarity index 96% rename from org.yakindu.sct.examples.digitalwatch/index.html rename to itemis.create.examples.digitalwatch/index.html index 80561201..a3fdda23 100644 --- a/org.yakindu.sct.examples.digitalwatch/index.html +++ b/itemis.create.examples.digitalwatch/index.html @@ -30,7 +30,7 @@

    The Digital Watch in all its Details

    Gaining a Better Understanding Using Subdiagrams

    -

    We can use a YAKINDU SCT feature to extract composite states into +

    We can use a CREATE SCT feature to extract composite states into subdiagrams. This makes the statechart much easier to comprehend:

    - + diff --git a/org.yakindu.sct.examples.digitalwatch/model/watch_subdiagrams.ysc b/itemis.create.examples.digitalwatch/model/watch_subdiagrams.ysc similarity index 99% rename from org.yakindu.sct.examples.digitalwatch/model/watch_subdiagrams.ysc rename to itemis.create.examples.digitalwatch/model/watch_subdiagrams.ysc index b99e59df..254017ef 100644 --- a/org.yakindu.sct.examples.digitalwatch/model/watch_subdiagrams.ysc +++ b/itemis.create.examples.digitalwatch/model/watch_subdiagrams.ysc @@ -139,7 +139,7 @@ - + @@ -869,7 +869,7 @@ - + @@ -1148,7 +1148,7 @@ - + diff --git a/org.yakindu.sct.examples.elevator/.gitignore b/itemis.create.examples.elevator/.gitignore similarity index 100% rename from org.yakindu.sct.examples.elevator/.gitignore rename to itemis.create.examples.elevator/.gitignore diff --git a/org.yakindu.sct.examples.sctunit/.project b/itemis.create.examples.elevator/.project similarity index 88% rename from org.yakindu.sct.examples.sctunit/.project rename to itemis.create.examples.elevator/.project index 61a8d9de..95087ed8 100644 --- a/org.yakindu.sct.examples.sctunit/.project +++ b/itemis.create.examples.elevator/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.sctunit + itemis.create.examples.elevator diff --git a/org.yakindu.sct.examples.codegen.java/css/style.css b/itemis.create.examples.elevator/css/style.css similarity index 100% rename from org.yakindu.sct.examples.codegen.java/css/style.css rename to itemis.create.examples.elevator/css/style.css diff --git a/org.yakindu.sct.examples.elevator/images/elevator.jpg b/itemis.create.examples.elevator/images/elevator.jpg similarity index 100% rename from org.yakindu.sct.examples.elevator/images/elevator.jpg rename to itemis.create.examples.elevator/images/elevator.jpg diff --git a/org.yakindu.sct.examples.elevator/index.html b/itemis.create.examples.elevator/index.html similarity index 88% rename from org.yakindu.sct.examples.elevator/index.html rename to itemis.create.examples.elevator/index.html index fde921cc..98fa5378 100644 --- a/org.yakindu.sct.examples.elevator/index.html +++ b/itemis.create.examples.elevator/index.html @@ -12,7 +12,7 @@

    Elevator with SCTUnit

    -

    This video tutorial is presented by Prof. Tom Mens (Software Engineering Lab, University of Mons). It provides a hands-on demonstration, on the basis of a simulation of an elevator statechart, on how to write and run unit tests for statecharts with Yakindu Statechart Tools.

    +

    This video tutorial is presented by Prof. Tom Mens (Software Engineering Lab, University of Mons). It provides a hands-on demonstration, on the basis of a simulation of an elevator statechart, on how to write and run unit tests for statecharts with Itemis CREATE.

    diff --git a/org.yakindu.sct.examples.elevator/metadata.json b/itemis.create.examples.elevator/metadata.json similarity index 85% rename from org.yakindu.sct.examples.elevator/metadata.json rename to itemis.create.examples.elevator/metadata.json index bf03cb58..16261f6e 100644 --- a/org.yakindu.sct.examples.elevator/metadata.json +++ b/itemis.create.examples.elevator/metadata.json @@ -1,7 +1,7 @@ { - "id": "org.yakindu.sct.examples.elevator", + "id": "itemis.create.examples.elevator", "title": "Elevator with SCTUnit", - "description": "This video tutorial is presented by Prof. Tom Mens (Software Engineering Lab, University of Mons). It provides a hands-on demonstration, on the basis of a simulation of an elevator statechart, on how to write and run unit tests for statecharts with Yakindu Statechart Tools.", + "description": "This video tutorial is presented by Prof. Tom Mens (Software Engineering Lab, University of Mons). It provides a hands-on demonstration, on the basis of a simulation of an elevator statechart, on how to write and run unit tests for statecharts with Itemis CREATE.", "previewImage": "elevator.jpg", "author": "Prof. Tom Mens", "organization": "Software Engineering Lab, University of Mons", diff --git a/org.yakindu.sct.examples.elevator/model/Elevator.ysc b/itemis.create.examples.elevator/model/Elevator.ysc similarity index 99% rename from org.yakindu.sct.examples.elevator/model/Elevator.ysc rename to itemis.create.examples.elevator/model/Elevator.ysc index d3fe9a67..b35aa294 100644 --- a/org.yakindu.sct.examples.elevator/model/Elevator.ysc +++ b/itemis.create.examples.elevator/model/Elevator.ysc @@ -23,7 +23,7 @@ - + diff --git a/org.yakindu.sct.examples.elevator/test/elevator.sctunit b/itemis.create.examples.elevator/test/elevator.sctunit similarity index 96% rename from org.yakindu.sct.examples.elevator/test/elevator.sctunit rename to itemis.create.examples.elevator/test/elevator.sctunit index 986b216c..9cb7cfb1 100644 --- a/org.yakindu.sct.examples.elevator/test/elevator.sctunit +++ b/itemis.create.examples.elevator/test/elevator.sctunit @@ -1,156 +1,156 @@ -testclass elevator for statechart Elevator { - - //Req 1: After initialisation, statechart is in Idle state, - // elevator is on ground floor, and no destination floor is selected - @Test - operation initiallyIdle() { - enter - assert(active(Elevator.main.Idle)) - assert(currentFloor == 0) - assert(destination == 0) - exit - } - - //Req 2: When new destination floor is requested, - // elevator should start moving - @Test - operation startMovingWhenFloorRequested() { - enter - // raise a "floor" request to another floor than the currentFloor - raise floor: currentFloor+5 - proceed 1 cycle - // The elevator will start moving - assert(active(Elevator.main.Moving)) - exit - } - - //Req 3: When requested floor is the same as current floor, - // elevator should remain idle. - @Test - operation dontMoveWhenRequestedFloorIsCurrentFloor() { - enter - // raise a "floor" event to make the elevator move to the currentFloor - raise floor:currentFloor - proceed 1 cycle - // The elevator will remain in its Idle state - assert(active(Elevator.main.Idle)) - } - - //Req 4: When requested floor is higher than current floor, - // elevator should start moving up - @Test - operation moveUpOneFloor() { - enter - var i:integer = currentFloor - raise floor:(currentFloor+1) - proceed 1 cycle - assert(active(Elevator.main.Moving.r1.MovingUp)) - assert(currentFloor == i+1) - //proceed 1 cycle - //assert(active(Elevator.main.Idle)) - exit - } - - //Req 4bis: When requested floor is lower than current floor, - // elevator should start moving down - @Test - operation moveDownOneFloor() { - enter - currentFloor = 5 - var i:integer = currentFloor - raise floor:(currentFloor-1) - proceed 1 cycle - assert(active(Elevator.main.Moving.r1.MovingDown)) - assert(currentFloor == i-1) - exit - } - - //Req 5: When moving UP to a requested floor, - // elevator should eventually reach the destination floor and become idle. - @Test - operation moveUpToRequestedFloorAboveCurrentFloor() { - enter - // raise a "floor" event to make the elevator move up 5 floors - raise floor:(currentFloor+5) - var i:integer = currentFloor - proceed 1 cycle - // check that elevator actually moves up one floor at a time - while(i < destination) { - i=i+1 - assert(active(Elevator.main.Moving.r1.MovingUp)) - assert(currentFloor == i) - proceed 1 cycle - } - assert(currentFloor == destination) - // after having reached destination, statechart should be in Idle state again - assert(active(Elevator.main.Idle)) - } - - //Req 5: When moving DOWN to a requested floor, - // elevator should eventually reach the destination floor and become idle. - @Test - operation moveDownToRequestedFloorBelowCurrentFloor() { - enter - // start by setting the current floor high enough to be able to move down - currentFloor = 10 - // raise a "floor" event to make the elevator move down 5 floors - raise floor:(currentFloor-5) - var i:integer = currentFloor - proceed 1 cycle - // check that elevator actually moves up one floor at a time - while(i > destination) { - i = i-1 - assert(active(Elevator.main.Moving.r1.MovingDown)) - assert(currentFloor == i) - proceed 1 cycle - } - assert(currentFloor==destination) - // after having reached destination, statechart should be in Idle state again - assert(active(Elevator.main.Idle)) - } - - //Req 6: If an idle elevator is not on the ground floor and does not receive a request, - // after 5 seconds it will start moving to the ground floor. - @Test - operation returnToGroundFloorAfterTimeout() { - // Here we should test the behaviour that, - // if the elevator is above the ground floor, - // and no floor event is received, - // we return to the ground floor after a delay of x seconds - enter - currentFloor = 10 - var i: integer = currentFloor - assert(active(Elevator.main.Idle)) - // after a timeout of 5 seconds, the elevator - // is automatically instructed to move to ground floor again: - proceed 5 s - assert(destination == 0) - proceed 10 cycle - // The following works as well instead of the 10 cycles, - // but is not really needed since this corresponds to testing - // the basic behaviour of moving the elevator down... - //while (i>0) { - // i = i - 1 - // assert(active(Elevator.main.Moving.r1.MovingDown)) - // assert(currentFloor ==i) - // proceed 1 cycle - // } - assert(active(Elevator.main.Idle)) - exit - } - - //Req 7: The elevator cannot move to a floor below ground level. - @Test - operation cannotMoveBeyondGroundLevel() { - enter - // try to make the elevator move below ground level - assert(active(Elevator.main.Idle)) - raise floor:-5 - proceed 1 cycle - // elevator simply stays in idle state, and destination remains unchanged - assert(active(Elevator.main.Idle)) - assert(destination == 0) - exit - } - -} +testclass elevator for statechart Elevator { + + //Req 1: After initialisation, statechart is in Idle state, + // elevator is on ground floor, and no destination floor is selected + @Test + operation initiallyIdle() { + enter + assert(active(Elevator.main.Idle)) + assert(currentFloor == 0) + assert(destination == 0) + exit + } + + //Req 2: When new destination floor is requested, + // elevator should start moving + @Test + operation startMovingWhenFloorRequested() { + enter + // raise a "floor" request to another floor than the currentFloor + raise floor: currentFloor+5 + proceed 1 cycle + // The elevator will start moving + assert(active(Elevator.main.Moving)) + exit + } + + //Req 3: When requested floor is the same as current floor, + // elevator should remain idle. + @Test + operation dontMoveWhenRequestedFloorIsCurrentFloor() { + enter + // raise a "floor" event to make the elevator move to the currentFloor + raise floor:currentFloor + proceed 1 cycle + // The elevator will remain in its Idle state + assert(active(Elevator.main.Idle)) + } + + //Req 4: When requested floor is higher than current floor, + // elevator should start moving up + @Test + operation moveUpOneFloor() { + enter + var i:integer = currentFloor + raise floor:(currentFloor+1) + proceed 1 cycle + assert(active(Elevator.main.Moving.r1.MovingUp)) + assert(currentFloor == i+1) + //proceed 1 cycle + //assert(active(Elevator.main.Idle)) + exit + } + + //Req 4bis: When requested floor is lower than current floor, + // elevator should start moving down + @Test + operation moveDownOneFloor() { + enter + currentFloor = 5 + var i:integer = currentFloor + raise floor:(currentFloor-1) + proceed 1 cycle + assert(active(Elevator.main.Moving.r1.MovingDown)) + assert(currentFloor == i-1) + exit + } + + //Req 5: When moving UP to a requested floor, + // elevator should eventually reach the destination floor and become idle. + @Test + operation moveUpToRequestedFloorAboveCurrentFloor() { + enter + // raise a "floor" event to make the elevator move up 5 floors + raise floor:(currentFloor+5) + var i:integer = currentFloor + proceed 1 cycle + // check that elevator actually moves up one floor at a time + while(i < destination) { + i=i+1 + assert(active(Elevator.main.Moving.r1.MovingUp)) + assert(currentFloor == i) + proceed 1 cycle + } + assert(currentFloor == destination) + // after having reached destination, statechart should be in Idle state again + assert(active(Elevator.main.Idle)) + } + + //Req 5: When moving DOWN to a requested floor, + // elevator should eventually reach the destination floor and become idle. + @Test + operation moveDownToRequestedFloorBelowCurrentFloor() { + enter + // start by setting the current floor high enough to be able to move down + currentFloor = 10 + // raise a "floor" event to make the elevator move down 5 floors + raise floor:(currentFloor-5) + var i:integer = currentFloor + proceed 1 cycle + // check that elevator actually moves up one floor at a time + while(i > destination) { + i = i-1 + assert(active(Elevator.main.Moving.r1.MovingDown)) + assert(currentFloor == i) + proceed 1 cycle + } + assert(currentFloor==destination) + // after having reached destination, statechart should be in Idle state again + assert(active(Elevator.main.Idle)) + } + + //Req 6: If an idle elevator is not on the ground floor and does not receive a request, + // after 5 seconds it will start moving to the ground floor. + @Test + operation returnToGroundFloorAfterTimeout() { + // Here we should test the behaviour that, + // if the elevator is above the ground floor, + // and no floor event is received, + // we return to the ground floor after a delay of x seconds + enter + currentFloor = 10 + var i: integer = currentFloor + assert(active(Elevator.main.Idle)) + // after a timeout of 5 seconds, the elevator + // is automatically instructed to move to ground floor again: + proceed 5 s + assert(destination == 0) + proceed 10 cycle + // The following works as well instead of the 10 cycles, + // but is not really needed since this corresponds to testing + // the basic behaviour of moving the elevator down... + //while (i>0) { + // i = i - 1 + // assert(active(Elevator.main.Moving.r1.MovingDown)) + // assert(currentFloor ==i) + // proceed 1 cycle + // } + assert(active(Elevator.main.Idle)) + exit + } + + //Req 7: The elevator cannot move to a floor below ground level. + @Test + operation cannotMoveBeyondGroundLevel() { + enter + // try to make the elevator move below ground level + assert(active(Elevator.main.Idle)) + raise floor:-5 + proceed 1 cycle + // elevator simply stays in idle state, and destination remains unchanged + assert(active(Elevator.main.Idle)) + assert(destination == 0) + exit + } + +} diff --git a/org.yakindu.sct.examples.esp32.tracing/.cproject b/itemis.create.examples.esp32.tracing/.cproject similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/.cproject rename to itemis.create.examples.esp32.tracing/.cproject diff --git a/org.yakindu.sct.examples.esp32.tracing/.gitignore b/itemis.create.examples.esp32.tracing/.gitignore similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/.gitignore rename to itemis.create.examples.esp32.tracing/.gitignore diff --git a/org.yakindu.sct.examples.esp32.tracing/.project b/itemis.create.examples.esp32.tracing/.project similarity index 92% rename from org.yakindu.sct.examples.esp32.tracing/.project rename to itemis.create.examples.esp32.tracing/.project index 75971261..e42cb7b4 100644 --- a/org.yakindu.sct.examples.esp32.tracing/.project +++ b/itemis.create.examples.esp32.tracing/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.esp32.tracing + itemis.create.examples.esp32.tracing diff --git a/org.yakindu.sct.examples.esp32.tracing/CMakeLists.txt b/itemis.create.examples.esp32.tracing/CMakeLists.txt similarity index 79% rename from org.yakindu.sct.examples.esp32.tracing/CMakeLists.txt rename to itemis.create.examples.esp32.tracing/CMakeLists.txt index 9b9ba894..361a2f81 100644 --- a/org.yakindu.sct.examples.esp32.tracing/CMakeLists.txt +++ b/itemis.create.examples.esp32.tracing/CMakeLists.txt @@ -3,4 +3,4 @@ cmake_minimum_required(VERSION 3.5) set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(org.yakindu.sct.examples.esp32.tracing) +project(itemis.create.examples.esp32.tracing) diff --git a/org.yakindu.sct.examples.esp32.tracing/Makefile b/itemis.create.examples.esp32.tracing/Makefile similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/Makefile rename to itemis.create.examples.esp32.tracing/Makefile diff --git a/org.yakindu.sct.examples.esp32.tracing/images/blinky.png b/itemis.create.examples.esp32.tracing/images/blinky.png similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/images/blinky.png rename to itemis.create.examples.esp32.tracing/images/blinky.png diff --git a/org.yakindu.sct.examples.esp32.tracing/images/runas.png b/itemis.create.examples.esp32.tracing/images/runas.png similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/images/runas.png rename to itemis.create.examples.esp32.tracing/images/runas.png diff --git a/org.yakindu.sct.examples.esp32.tracing/images/wifi_settings.png b/itemis.create.examples.esp32.tracing/images/wifi_settings.png similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/images/wifi_settings.png rename to itemis.create.examples.esp32.tracing/images/wifi_settings.png diff --git a/org.yakindu.sct.examples.esp32.tracing/images/yet_target_trace_debugging.png b/itemis.create.examples.esp32.tracing/images/yet_target_trace_debugging.png similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/images/yet_target_trace_debugging.png rename to itemis.create.examples.esp32.tracing/images/yet_target_trace_debugging.png diff --git a/org.yakindu.sct.examples.esp32.tracing/index.html b/itemis.create.examples.esp32.tracing/index.html similarity index 92% rename from org.yakindu.sct.examples.esp32.tracing/index.html rename to itemis.create.examples.esp32.tracing/index.html index 9c1daa70..c4dd0ee7 100644 --- a/org.yakindu.sct.examples.esp32.tracing/index.html +++ b/itemis.create.examples.esp32.tracing/index.html @@ -8,13 +8,13 @@
    - + DISCLAIMER: This example only work with UNIX based systems due to the nature of Eclipse console

    Debug and remote control state machines using YET

    - The YAKINDU Execution Trace (YET) infrastructure supports interoperability between - state machines running in a target application and the YAKINDU tooling. + The CREATE Execution Trace (YET) infrastructure supports interoperability between + state machines running in a target application and the CREATE tooling. It supports model-level debugging and testing of the state machines based on execution traces. This example shows how to remote debug a compiled state machine step by step. Please refer to the YET documentation for more information. diff --git a/org.yakindu.sct.examples.esp32.tracing/main/CMakeLists.txt b/itemis.create.examples.esp32.tracing/main/CMakeLists.txt similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/CMakeLists.txt rename to itemis.create.examples.esp32.tracing/main/CMakeLists.txt diff --git a/org.yakindu.sct.examples.esp32.tracing/main/Kconfig.projbuild b/itemis.create.examples.esp32.tracing/main/Kconfig.projbuild similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/Kconfig.projbuild rename to itemis.create.examples.esp32.tracing/main/Kconfig.projbuild diff --git a/org.yakindu.sct.examples.esp32.tracing/main/component.mk b/itemis.create.examples.esp32.tracing/main/component.mk similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/component.mk rename to itemis.create.examples.esp32.tracing/main/component.mk diff --git a/org.yakindu.sct.examples.esp32.tracing/main/hmi.c b/itemis.create.examples.esp32.tracing/main/hmi.c similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/hmi.c rename to itemis.create.examples.esp32.tracing/main/hmi.c diff --git a/org.yakindu.sct.examples.esp32.tracing/main/hmi.h b/itemis.create.examples.esp32.tracing/main/hmi.h similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/hmi.h rename to itemis.create.examples.esp32.tracing/main/hmi.h diff --git a/org.yakindu.sct.examples.esp32.tracing/main/main.c b/itemis.create.examples.esp32.tracing/main/main.c similarity index 99% rename from org.yakindu.sct.examples.esp32.tracing/main/main.c rename to itemis.create.examples.esp32.tracing/main/main.c index c3c22b23..ea3f1d82 100644 --- a/org.yakindu.sct.examples.esp32.tracing/main/main.c +++ b/itemis.create.examples.esp32.tracing/main/main.c @@ -206,7 +206,7 @@ void app_main(int argc, char **argv) ESP_ERROR_CHECK(example_connect()); - printf("Hello YAKINDU Statechart Tools!\n"); + printf("Hello Itemis CREATE!\n"); timestamp_offset = get_ms(); diff --git a/org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_logger.c b/itemis.create.examples.esp32.tracing/main/sc/util/yet_logger.c similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_logger.c rename to itemis.create.examples.esp32.tracing/main/sc/util/yet_logger.c diff --git a/org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_logger.h b/itemis.create.examples.esp32.tracing/main/sc/util/yet_logger.h similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_logger.h rename to itemis.create.examples.esp32.tracing/main/sc/util/yet_logger.h diff --git a/org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_udp_stream.c b/itemis.create.examples.esp32.tracing/main/sc/util/yet_udp_stream.c similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_udp_stream.c rename to itemis.create.examples.esp32.tracing/main/sc/util/yet_udp_stream.c diff --git a/org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_udp_stream.h b/itemis.create.examples.esp32.tracing/main/sc/util/yet_udp_stream.h similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/main/sc/util/yet_udp_stream.h rename to itemis.create.examples.esp32.tracing/main/sc/util/yet_udp_stream.h diff --git a/org.yakindu.sct.examples.esp32.tracing/metadata.json b/itemis.create.examples.esp32.tracing/metadata.json similarity index 79% rename from org.yakindu.sct.examples.esp32.tracing/metadata.json rename to itemis.create.examples.esp32.tracing/metadata.json index a5a8b75f..8346be82 100644 --- a/org.yakindu.sct.examples.esp32.tracing/metadata.json +++ b/itemis.create.examples.esp32.tracing/metadata.json @@ -1,7 +1,7 @@ { - "id": "org.yakindu.sct.examples.esp32.tracing", + "id": "itemis.create.examples.esp32.tracing", "title": "ESP32 - Tracing & Remote Control (C)", - "description": "YAKINDU provides infrastructure for debugging and remote controlling the state machines using execution traces (YET).", + "description": "CREATE provides infrastructure for debugging and remote controlling the state machines using execution traces (YET).", "previewImage": "yet_target_trace_debugging.png", "author": "itemis AG", "license": "GNU Free Documentation License version 1.3", diff --git a/org.yakindu.sct.examples.esp32.tracing/model/blink.ysc b/itemis.create.examples.esp32.tracing/model/blink.ysc similarity index 99% rename from org.yakindu.sct.examples.esp32.tracing/model/blink.ysc rename to itemis.create.examples.esp32.tracing/model/blink.ysc index 84151ed5..042b183d 100644 --- a/org.yakindu.sct.examples.esp32.tracing/model/blink.ysc +++ b/itemis.create.examples.esp32.tracing/model/blink.ysc @@ -24,7 +24,7 @@ - + diff --git a/org.yakindu.sct.examples.esp32.tracing/model/sm.sgen b/itemis.create.examples.esp32.tracing/model/sm.sgen similarity index 74% rename from org.yakindu.sct.examples.esp32.tracing/model/sm.sgen rename to itemis.create.examples.esp32.tracing/model/sm.sgen index df712992..59ab5b41 100644 --- a/org.yakindu.sct.examples.esp32.tracing/model/sm.sgen +++ b/itemis.create.examples.esp32.tracing/model/sm.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { statechart blink { feature Outlet { - targetProject = "org.yakindu.sct.examples.esp32.tracing" + targetProject = "itemis.create.examples.esp32.tracing" targetFolder = "main/sc/sm" libraryTargetFolder = "main/sc/base" } diff --git a/org.yakindu.sct.examples.esp32.tracing/model/yet.sgen b/itemis.create.examples.esp32.tracing/model/yet.sgen similarity index 54% rename from org.yakindu.sct.examples.esp32.tracing/model/yet.sgen rename to itemis.create.examples.esp32.tracing/model/yet.sgen index 348c2194..24dad8d7 100644 --- a/org.yakindu.sct.examples.esp32.tracing/model/yet.sgen +++ b/itemis.create.examples.esp32.tracing/model/yet.sgen @@ -1,8 +1,8 @@ -GeneratorModel for yakindu::c::yet { +GeneratorModel for create::c::yet { statechart blink { feature Outlet { - targetProject = "org.yakindu.sct.examples.esp32.tracing" + targetProject = "itemis.create.examples.esp32.tracing" targetFolder = "main/sc/sm" libraryTargetFolder = "main/sc/base" } diff --git a/org.yakindu.sct.examples.esp32.tracing/sdkconfig b/itemis.create.examples.esp32.tracing/sdkconfig similarity index 100% rename from org.yakindu.sct.examples.esp32.tracing/sdkconfig rename to itemis.create.examples.esp32.tracing/sdkconfig diff --git a/org.yakindu.sct.examples.fmu.bouncingball/.cproject b/itemis.create.examples.fmu.bouncingball/.cproject similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/.cproject rename to itemis.create.examples.fmu.bouncingball/.cproject diff --git a/org.yakindu.sct.examples.fmu.bouncingball/.gitignore b/itemis.create.examples.fmu.bouncingball/.gitignore similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/.gitignore rename to itemis.create.examples.fmu.bouncingball/.gitignore diff --git a/com.yakindu.sct.examples.codegen.multism.c/.project b/itemis.create.examples.fmu.bouncingball/.project similarity index 94% rename from com.yakindu.sct.examples.codegen.multism.c/.project rename to itemis.create.examples.fmu.bouncingball/.project index 8540a578..b8d507f5 100644 --- a/com.yakindu.sct.examples.codegen.multism.c/.project +++ b/itemis.create.examples.fmu.bouncingball/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.codegen.multism.c + itemis.create.examples.fmu.bouncingball diff --git a/org.yakindu.sct.examples.codegen.python/css/style.css b/itemis.create.examples.fmu.bouncingball/css/style.css similarity index 100% rename from org.yakindu.sct.examples.codegen.python/css/style.css rename to itemis.create.examples.fmu.bouncingball/css/style.css diff --git a/org.yakindu.sct.examples.fmu.bouncingball/images/model.png b/itemis.create.examples.fmu.bouncingball/images/model.png similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/images/model.png rename to itemis.create.examples.fmu.bouncingball/images/model.png diff --git a/org.yakindu.sct.examples.fmu.bouncingball/images/results.png b/itemis.create.examples.fmu.bouncingball/images/results.png similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/images/results.png rename to itemis.create.examples.fmu.bouncingball/images/results.png diff --git a/org.yakindu.sct.examples.fmu.bouncingball/images/watch_gears_thumb.jpg b/itemis.create.examples.fmu.bouncingball/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/images/watch_gears_thumb.jpg rename to itemis.create.examples.fmu.bouncingball/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.fmu.bouncingball/index.html b/itemis.create.examples.fmu.bouncingball/index.html similarity index 88% rename from org.yakindu.sct.examples.fmu.bouncingball/index.html rename to itemis.create.examples.fmu.bouncingball/index.html index 7aada980..6a0b2bc3 100644 --- a/org.yakindu.sct.examples.fmu.bouncingball/index.html +++ b/itemis.create.examples.fmu.bouncingball/index.html @@ -15,8 +15,8 @@

    FMU Code Generation

    The Functional Mock-up Interface (FMI) standard addresses the exchange and joint execution of models for co-simulation. It mainly is applied for system level simulation of complex systems. - YAKINDU statecharts can be exported as *Functional Mock-up Units (FMUs)* and as such can participate in FMI based simulations. As FMUs provide binary executables and only bundle source code or models as an option FMUs can be - provided to other parties without exposing intellectual property. Concretely, YAKINDU Statechart Tools supports FMI 2.0 for Co-Simulation FMU export. By the support of the FMI standard YAKINDU statecharts are interoperable with + CREATE statecharts can be exported as *Functional Mock-up Units (FMUs)* and as such can participate in FMI based simulations. As FMUs provide binary executables and only bundle source code or models as an option FMUs can be + provided to other parties without exposing intellectual property. Concretely, Itemis CREATE supports FMI 2.0 for Co-Simulation FMU export. By the support of the FMI standard CREATE statecharts are interoperable with a wide range of simulation tools.

    @@ -44,7 +44,7 @@

    Generator Model

    The new generator model will look similar to this one:

    - +

    The generator model defines where the code should be generated into by specifying the target project and target folders. diff --git a/org.yakindu.sct.examples.fmu.bouncingball/metadata.json b/itemis.create.examples.fmu.bouncingball/metadata.json similarity index 88% rename from org.yakindu.sct.examples.fmu.bouncingball/metadata.json rename to itemis.create.examples.fmu.bouncingball/metadata.json index d49ae8c3..64583bd6 100644 --- a/org.yakindu.sct.examples.fmu.bouncingball/metadata.json +++ b/itemis.create.examples.fmu.bouncingball/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.fmu.bouncingball", + "id": "itemis.create.examples.fmu.bouncingball", "title": "FMU Code Generation", "author": "itemis AG", "description": "This example demonstrates how to generate an FMU from a statechart.", diff --git a/org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.sgen b/itemis.create.examples.fmu.bouncingball/models/BouncingBall.sgen similarity index 62% rename from org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.sgen rename to itemis.create.examples.fmu.bouncingball/models/BouncingBall.sgen index 6530b24b..8f2ae892 100644 --- a/org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.sgen +++ b/itemis.create.examples.fmu.bouncingball/models/BouncingBall.sgen @@ -1,6 +1,6 @@ -GeneratorModel for yakindu::c::fmu { +GeneratorModel for create::c::fmu { - const PROJECT : string = "org.yakindu.sct.examples.fmu.bouncingball" + const PROJECT : string = "itemis.create.examples.fmu.bouncingball" const FOLDER : string = "src-gen" diff --git a/org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.ysc b/itemis.create.examples.fmu.bouncingball/models/BouncingBall.ysc similarity index 98% rename from org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.ysc rename to itemis.create.examples.fmu.bouncingball/models/BouncingBall.ysc index c7f04159..1cbb5262 100644 --- a/org.yakindu.sct.examples.fmu.bouncingball/models/BouncingBall.ysc +++ b/itemis.create.examples.fmu.bouncingball/models/BouncingBall.ysc @@ -15,7 +15,7 @@ - + diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/.cproject b/itemis.create.examples.hmi.cpp.arduino/.cproject similarity index 91% rename from org.yakindu.sct.examples.hmi.cpp.arduino/.cproject rename to itemis.create.examples.hmi.cpp.arduino/.cproject index 03cc862a..bb69ca75 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/.cproject +++ b/itemis.create.examples.hmi.cpp.arduino/.cproject @@ -24,9 +24,9 @@ - - - + + + @@ -37,9 +37,9 @@ - - - + + + @@ -50,9 +50,9 @@ - - - + + + diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/.gitignore b/itemis.create.examples.hmi.cpp.arduino/.gitignore similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/.gitignore rename to itemis.create.examples.hmi.cpp.arduino/.gitignore diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/.project b/itemis.create.examples.hmi.cpp.arduino/.project similarity index 96% rename from org.yakindu.sct.examples.hmi.cpp.arduino/.project rename to itemis.create.examples.hmi.cpp.arduino/.project index 5c29228c..f48431d9 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/.project +++ b/itemis.create.examples.hmi.cpp.arduino/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.hmi.cpp.arduino + itemis.create.examples.hmi.cpp.arduino diff --git a/org.yakindu.sct.examples.codegen.scxml/css/style.css b/itemis.create.examples.hmi.cpp.arduino/css/style.css similarity index 100% rename from org.yakindu.sct.examples.codegen.scxml/css/style.css rename to itemis.create.examples.hmi.cpp.arduino/css/style.css diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/ArduinoHMI.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/ArduinoHMI.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/ArduinoHMI.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/ArduinoHMI.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/ArduinoHMISimple.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/ArduinoHMISimple.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/ArduinoHMISimple.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/ArduinoHMISimple.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/Counter.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/Counter.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/Counter.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/Counter.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/HMI_LCD.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/HMI_LCD.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/HMI_LCD.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/HMI_LCD.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/HandleStates.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/HandleStates.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/HandleStates.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/HandleStates.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/StopWatch.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/StopWatch.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/StopWatch.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/StopWatch.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/images/defnitionSection.jpeg b/itemis.create.examples.hmi.cpp.arduino/images/defnitionSection.jpeg similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/images/defnitionSection.jpeg rename to itemis.create.examples.hmi.cpp.arduino/images/defnitionSection.jpeg diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/index.html b/itemis.create.examples.hmi.cpp.arduino/index.html similarity index 97% rename from org.yakindu.sct.examples.hmi.cpp.arduino/index.html rename to itemis.create.examples.hmi.cpp.arduino/index.html index 170c957b..37454fd5 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/index.html +++ b/itemis.create.examples.hmi.cpp.arduino/index.html @@ -1,84 +1,84 @@ - - - - -Traffic Light (C++) for Arduino - - - -

    - -

    HMI with LCD Keypad Shield (C++) for Arduino

    - -

    Expandable HMI example for Arduino using a 16x2 LCD Keypad Shield.

    - -

    - The statechart -

    - -

    The full example description can be found on Instructables. -

    -

    - This video shows the running application: -

    -
    - -
    -

    - This video shows how to simulate the state machine: -

    -
    - -
    - -

    Addons for compiling and flashing

    -

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. -

    How to install the Sloeber plugin

    -

    - There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. -

    -

    - Another way is installing the plugin manually. You need to follow these steps: -

      -
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. -
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. -
    5. Choose the plugin - not the IDE.
    6. -
    7. Follow the instructions
    8. -
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. -
    -

    Configure the Sloeber plugin

    -

    - After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. - Initially, the projects are not configured, as you may require to add the toolchain: -

      -
    1. Click on Window -> Preferences
    2. -
    3. Open the Arduino window -> Platforms and Boards
    4. -
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. -
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. -
    - Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. -

    -

    Configure the example

    - Once you have installed the toolchain for your Arduino, you can configure the project. -
      -
    1. Right click the project and open the Preference page
    2. -
    3. Open the Arduino window
    4. -
    5. Choose your platform and port
    6. -
    - There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. -

    Compile and upload

    -

    - Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! -

    -

    Required libraries

    -

    -

      -
    1. LiquidCrystal
    2. -
    -

    - -
    - - - + + + + +Traffic Light (C++) for Arduino + + + +
    + +

    HMI with LCD Keypad Shield (C++) for Arduino

    + +

    Expandable HMI example for Arduino using a 16x2 LCD Keypad Shield.

    + +

    + The statechart +

    + +

    The full example description can be found on Instructables. +

    +

    + This video shows the running application: +

    +
    + +
    +

    + This video shows how to simulate the state machine: +

    +
    + +
    + +

    Addons for compiling and flashing

    +

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. +

    How to install the Sloeber plugin

    +

    + There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. +

    +

    + Another way is installing the plugin manually. You need to follow these steps: +

      +
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. +
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. +
    5. Choose the plugin - not the IDE.
    6. +
    7. Follow the instructions
    8. +
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. +
    +

    Configure the Sloeber plugin

    +

    + After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. + Initially, the projects are not configured, as you may require to add the toolchain: +

      +
    1. Click on Window -> Preferences
    2. +
    3. Open the Arduino window -> Platforms and Boards
    4. +
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. +
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. +
    + Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. +

    +

    Configure the example

    + Once you have installed the toolchain for your Arduino, you can configure the project. +
      +
    1. Right click the project and open the Preference page
    2. +
    3. Open the Arduino window
    4. +
    5. Choose your platform and port
    6. +
    + There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. +

    Compile and upload

    +

    + Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! +

    +

    Required libraries

    +

    +

      +
    1. LiquidCrystal
    2. +
    +

    + +
    + + + diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/main.ino b/itemis.create.examples.hmi.cpp.arduino/main.ino similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/main.ino rename to itemis.create.examples.hmi.cpp.arduino/main.ino diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/metadata.json b/itemis.create.examples.hmi.cpp.arduino/metadata.json similarity index 90% rename from org.yakindu.sct.examples.hmi.cpp.arduino/metadata.json rename to itemis.create.examples.hmi.cpp.arduino/metadata.json index 1053415d..0dd5c2ae 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/metadata.json +++ b/itemis.create.examples.hmi.cpp.arduino/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.hmi.cpp.arduino", + "id": "itemis.create.examples.hmi.cpp.arduino", "title": "Arduino - HMI with LCD Keypad Shield (C++)", "author": "itemis AG", "description": "Expandable HMI example for Arduino using a 16x2 LCD Keypad Shield", diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen b/itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen similarity index 59% rename from org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen rename to itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen index 7f5d9bcc..769e50ed 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen +++ b/itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { statechart ArduinoHMI { feature Outlet { - targetProject = "org.yakindu.sct.examples.hmi.cpp.arduino" + targetProject = "itemis.create.examples.hmi.cpp.arduino" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc b/itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc similarity index 99% rename from org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc rename to itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc index 3923f548..fa8955f9 100644 --- a/org.yakindu.sct.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc +++ b/itemis.create.examples.hmi.cpp.arduino/model/ArduinoHMI.ysc @@ -102,7 +102,7 @@ - + @@ -516,7 +516,7 @@ - + @@ -722,11 +722,11 @@ - + - + @@ -933,7 +933,7 @@ - + @@ -1074,7 +1074,7 @@ - + diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/src/DisplayHandler.cpp b/itemis.create.examples.hmi.cpp.arduino/src/DisplayHandler.cpp similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/src/DisplayHandler.cpp rename to itemis.create.examples.hmi.cpp.arduino/src/DisplayHandler.cpp diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/src/DisplayHandler.h b/itemis.create.examples.hmi.cpp.arduino/src/DisplayHandler.h similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/src/DisplayHandler.h rename to itemis.create.examples.hmi.cpp.arduino/src/DisplayHandler.h diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/.cproject b/itemis.create.examples.integration.c.arduino.interrupts/.cproject similarity index 85% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/.cproject rename to itemis.create.examples.integration.c.arduino.interrupts/.cproject index 14945ffa..dda36af0 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.interrupts/.cproject +++ b/itemis.create.examples.integration.c.arduino.interrupts/.cproject @@ -19,25 +19,25 @@ @@ -65,7 +65,7 @@ - + \ No newline at end of file diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/.gitignore b/itemis.create.examples.integration.c.arduino.interrupts/.gitignore similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/.gitignore rename to itemis.create.examples.integration.c.arduino.interrupts/.gitignore diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/.project b/itemis.create.examples.integration.c.arduino.interrupts/.project similarity index 96% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/.project rename to itemis.create.examples.integration.c.arduino.interrupts/.project index 700c37c0..4b1d96c3 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.interrupts/.project +++ b/itemis.create.examples.integration.c.arduino.interrupts/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.integration.c.arduino.interrupts + itemis.create.examples.integration.c.arduino.interrupts diff --git a/org.yakindu.sct.examples.digitalwatch.cpp.arduino/css/style.css b/itemis.create.examples.integration.c.arduino.interrupts/css/style.css similarity index 100% rename from org.yakindu.sct.examples.digitalwatch.cpp.arduino/css/style.css rename to itemis.create.examples.integration.c.arduino.interrupts/css/style.css diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/images/embedded_system.jpg b/itemis.create.examples.integration.c.arduino.interrupts/images/embedded_system.jpg similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/images/embedded_system.jpg rename to itemis.create.examples.integration.c.arduino.interrupts/images/embedded_system.jpg diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/images/platform_integration_example.jpeg b/itemis.create.examples.integration.c.arduino.interrupts/images/platform_integration_example.jpeg similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/images/platform_integration_example.jpeg rename to itemis.create.examples.integration.c.arduino.interrupts/images/platform_integration_example.jpeg diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/index.html b/itemis.create.examples.integration.c.arduino.interrupts/index.html similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/index.html rename to itemis.create.examples.integration.c.arduino.interrupts/index.html diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/main.ino b/itemis.create.examples.integration.c.arduino.interrupts/main.ino similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/main.ino rename to itemis.create.examples.integration.c.arduino.interrupts/main.ino diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/metadata.json b/itemis.create.examples.integration.c.arduino.interrupts/metadata.json similarity index 86% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/metadata.json rename to itemis.create.examples.integration.c.arduino.interrupts/metadata.json index e5859d79..cac05126 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.interrupts/metadata.json +++ b/itemis.create.examples.integration.c.arduino.interrupts/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.integration.c.arduino.interrupts", + "id": "itemis.create.examples.integration.c.arduino.interrupts", "title": "Arduino - Bare-Metal Interrupts (C)", "author": "itemis AG", "description": "Embedded Systems Integration Guide - Arduino with @CycleBased or @EventDriven execution using Interrupts.", diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/model/CodeGenerator.sgen b/itemis.create.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen similarity index 60% rename from org.yakindu.sct.examples.integration.c.arduino.polling/model/CodeGenerator.sgen rename to itemis.create.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen index 7a41f40b..2d2ba385 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/model/CodeGenerator.sgen +++ b/itemis.create.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen @@ -1,15 +1,15 @@ -GeneratorModel for yakindu::c { - - statechart StateMachine { - - feature Outlet { - targetProject = - "org.yakindu.sct.examples.integration.c.arduino.polling" - targetFolder = "src-gen" - } - - feature GeneralFeatures { - timerService = true - } - } +GeneratorModel for create::c { + + statechart StateMachine { + + feature Outlet { + targetProject = + "itemis.create.examples.integration.c.arduino.interrupts" + targetFolder = "src-gen" + } + + feature GeneralFeatures { + timerService = true + } + } } \ No newline at end of file diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/model/StateMachine.ysc b/itemis.create.examples.integration.c.arduino.interrupts/model/StateMachine.ysc similarity index 98% rename from org.yakindu.sct.examples.integration.c.arduino.polling/model/StateMachine.ysc rename to itemis.create.examples.integration.c.arduino.interrupts/model/StateMachine.ysc index 58d6ed0f..35263828 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/model/StateMachine.ysc +++ b/itemis.create.examples.integration.c.arduino.interrupts/model/StateMachine.ysc @@ -15,7 +15,7 @@ - + diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/src/hw_impl.c b/itemis.create.examples.integration.c.arduino.interrupts/src/hw_impl.c similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/src/hw_impl.c rename to itemis.create.examples.integration.c.arduino.interrupts/src/hw_impl.c diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/src/hw_impl.h b/itemis.create.examples.integration.c.arduino.interrupts/src/hw_impl.h similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/src/hw_impl.h rename to itemis.create.examples.integration.c.arduino.interrupts/src/hw_impl.h diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/src/timer_impl.c b/itemis.create.examples.integration.c.arduino.interrupts/src/timer_impl.c similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/src/timer_impl.c rename to itemis.create.examples.integration.c.arduino.interrupts/src/timer_impl.c diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/src/timer_impl.h b/itemis.create.examples.integration.c.arduino.interrupts/src/timer_impl.h similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/src/timer_impl.h rename to itemis.create.examples.integration.c.arduino.interrupts/src/timer_impl.h diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/.cproject b/itemis.create.examples.integration.c.arduino.polling/.cproject similarity index 81% rename from org.yakindu.sct.examples.integration.c.arduino.polling/.cproject rename to itemis.create.examples.integration.c.arduino.polling/.cproject index 5c2e051b..493c1d58 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/.cproject +++ b/itemis.create.examples.integration.c.arduino.polling/.cproject @@ -19,31 +19,31 @@ diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/.gitignore b/itemis.create.examples.integration.c.arduino.polling/.gitignore similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/.gitignore rename to itemis.create.examples.integration.c.arduino.polling/.gitignore diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/.project b/itemis.create.examples.integration.c.arduino.polling/.project similarity index 96% rename from org.yakindu.sct.examples.integration.c.arduino.polling/.project rename to itemis.create.examples.integration.c.arduino.polling/.project index dfa12a76..a285157a 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/.project +++ b/itemis.create.examples.integration.c.arduino.polling/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.integration.c.arduino.polling + itemis.create.examples.integration.c.arduino.polling diff --git a/org.yakindu.sct.examples.digitalwatch/css/style.css b/itemis.create.examples.integration.c.arduino.polling/css/style.css similarity index 100% rename from org.yakindu.sct.examples.digitalwatch/css/style.css rename to itemis.create.examples.integration.c.arduino.polling/css/style.css diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/images/embedded_system.jpg b/itemis.create.examples.integration.c.arduino.polling/images/embedded_system.jpg similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.polling/images/embedded_system.jpg rename to itemis.create.examples.integration.c.arduino.polling/images/embedded_system.jpg diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/images/platform_integration_example.jpeg b/itemis.create.examples.integration.c.arduino.polling/images/platform_integration_example.jpeg similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.polling/images/platform_integration_example.jpeg rename to itemis.create.examples.integration.c.arduino.polling/images/platform_integration_example.jpeg diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/index.html b/itemis.create.examples.integration.c.arduino.polling/index.html similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.polling/index.html rename to itemis.create.examples.integration.c.arduino.polling/index.html diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/main.ino b/itemis.create.examples.integration.c.arduino.polling/main.ino similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.polling/main.ino rename to itemis.create.examples.integration.c.arduino.polling/main.ino diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/metadata.json b/itemis.create.examples.integration.c.arduino.polling/metadata.json similarity index 86% rename from org.yakindu.sct.examples.integration.c.arduino.polling/metadata.json rename to itemis.create.examples.integration.c.arduino.polling/metadata.json index b900bc6a..bae24d74 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/metadata.json +++ b/itemis.create.examples.integration.c.arduino.polling/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.integration.c.arduino.polling", + "id": "itemis.create.examples.integration.c.arduino.polling", "title": "Arduino - Bare-Metal Polling (C)", "author": "itemis AG", "description": "Embedded Systems Integration Guide - Arduino with @CycleBased or @EventDriven execution using Polling.", diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen b/itemis.create.examples.integration.c.arduino.polling/model/CodeGenerator.sgen similarity index 59% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen rename to itemis.create.examples.integration.c.arduino.polling/model/CodeGenerator.sgen index 6475f16b..f50f843d 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.interrupts/model/CodeGenerator.sgen +++ b/itemis.create.examples.integration.c.arduino.polling/model/CodeGenerator.sgen @@ -1,15 +1,15 @@ -GeneratorModel for yakindu::c { - - statechart StateMachine { - - feature Outlet { - targetProject = - "org.yakindu.sct.examples.integration.c.arduino.interrupts" - targetFolder = "src-gen" - } - - feature GeneralFeatures { - timerService = true - } - } +GeneratorModel for create::c { + + statechart StateMachine { + + feature Outlet { + targetProject = + "itemis.create.examples.integration.c.arduino.polling" + targetFolder = "src-gen" + } + + feature GeneralFeatures { + timerService = true + } + } } \ No newline at end of file diff --git a/org.yakindu.sct.examples.integration.c.arduino.interrupts/model/StateMachine.ysc b/itemis.create.examples.integration.c.arduino.polling/model/StateMachine.ysc similarity index 98% rename from org.yakindu.sct.examples.integration.c.arduino.interrupts/model/StateMachine.ysc rename to itemis.create.examples.integration.c.arduino.polling/model/StateMachine.ysc index 58d6ed0f..35263828 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.interrupts/model/StateMachine.ysc +++ b/itemis.create.examples.integration.c.arduino.polling/model/StateMachine.ysc @@ -15,7 +15,7 @@ - + diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.c b/itemis.create.examples.integration.c.arduino.polling/src/hw_impl.c similarity index 96% rename from org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.c rename to itemis.create.examples.integration.c.arduino.polling/src/hw_impl.c index f8504683..d50bc6fa 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.c +++ b/itemis.create.examples.integration.c.arduino.polling/src/hw_impl.c @@ -1,52 +1,52 @@ -#include "hw_impl.h" -#include "avr/sleep.h" - -/*! Setup the hardware you're using. - * Digital/Analog Ports, Sensors, Actuators, Communication */ -void hw_init(){ - pinMode(13, OUTPUT); - pinMode(2, INPUT); - pinMode(3, INPUT); - digitalWrite(13, LOW); -} - -/*! Poll the inputs/sensors. - * Wire inputs to the according event.*/ -void handle_in_events(StateMachine* handle) { - if(digitalRead(2) == HIGH) { - stateMachine_raise_inEvent1(handle); - } - if(digitalRead(3) == HIGH) { - stateMachine_raise_inEvent2(handle); - } -} - -/*! Callback for outEvent1. Setting actuator. */ -void on_outEvent1(StateMachine* handle) { - (void) handle; - digitalWrite(13, LOW); -} - -/*! Callback for outEvent2. Setting actuator. */ -void on_outEvent2(StateMachine* handle) { - (void) handle; - digitalWrite(13, HIGH); -} - -/*! Subscribe observer to state machine observables. - * Thus, every time they will be raised, - * the registered callback will be called. */ -void subscribe_observers(StateMachine *handle, - sc_single_subscription_observer *outEvent1Observer, - sc_single_subscription_observer *outEvent2Observer) { - - sc_single_subscription_observer_init(outEvent1Observer, handle, - (sc_observer_next_fp) on_outEvent1); - sc_single_subscription_observer_subscribe(outEvent1Observer, - &handle->iface.outEvent1); - - sc_single_subscription_observer_init(outEvent2Observer, handle, - (sc_observer_next_fp) on_outEvent2); - sc_single_subscription_observer_subscribe(outEvent2Observer, - &handle->iface.outEvent2); -} +#include "hw_impl.h" +#include "avr/sleep.h" + +/*! Setup the hardware you're using. + * Digital/Analog Ports, Sensors, Actuators, Communication */ +void hw_init(){ + pinMode(13, OUTPUT); + pinMode(2, INPUT); + pinMode(3, INPUT); + digitalWrite(13, LOW); +} + +/*! Poll the inputs/sensors. + * Wire inputs to the according event.*/ +void handle_in_events(StateMachine* handle) { + if(digitalRead(2) == HIGH) { + stateMachine_raise_inEvent1(handle); + } + if(digitalRead(3) == HIGH) { + stateMachine_raise_inEvent2(handle); + } +} + +/*! Callback for outEvent1. Setting actuator. */ +void on_outEvent1(StateMachine* handle) { + (void) handle; + digitalWrite(13, LOW); +} + +/*! Callback for outEvent2. Setting actuator. */ +void on_outEvent2(StateMachine* handle) { + (void) handle; + digitalWrite(13, HIGH); +} + +/*! Subscribe observer to state machine observables. + * Thus, every time they will be raised, + * the registered callback will be called. */ +void subscribe_observers(StateMachine *handle, + sc_single_subscription_observer *outEvent1Observer, + sc_single_subscription_observer *outEvent2Observer) { + + sc_single_subscription_observer_init(outEvent1Observer, handle, + (sc_observer_next_fp) on_outEvent1); + sc_single_subscription_observer_subscribe(outEvent1Observer, + &handle->iface.outEvent1); + + sc_single_subscription_observer_init(outEvent2Observer, handle, + (sc_observer_next_fp) on_outEvent2); + sc_single_subscription_observer_subscribe(outEvent2Observer, + &handle->iface.outEvent2); +} diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.h b/itemis.create.examples.integration.c.arduino.polling/src/hw_impl.h similarity index 96% rename from org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.h rename to itemis.create.examples.integration.c.arduino.polling/src/hw_impl.h index 029f7876..fdfa0a2f 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/src/hw_impl.h +++ b/itemis.create.examples.integration.c.arduino.polling/src/hw_impl.h @@ -1,41 +1,41 @@ -#ifndef SRC_HW_IMPL_H_ -#define SRC_HW_IMPL_H_ - -#include "Arduino.h" -#include "../src-gen/StateMachine.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*! Setup the hardware you're using. - * Digital/Analog Ports, Sensors, Actuators, Communication */ -void hw_init(); - -/*! Poll the inputs/sensors. - * Wire inputs to the according event.*/ -void handle_in_events(StateMachine* handle); - -/*! Update your actuators, by checking the - * out event status */ -void handle_out_events(StateMachine* handle); - - -/*! Callback for outEvent1. Setting actuator. */ -void on_outEvent1(StateMachine* handle); - -/*! Callback for outEvent2. Setting actuator. */ -void on_outEvent2(StateMachine* handle); - -/*! Subscribe observer to state machine observables. - * Thus, every time they will be raised, - * the registered callback will be called. */ -void subscribe_observers(StateMachine *handle, - sc_single_subscription_observer *outEvent1Observer, - sc_single_subscription_observer *outEvent2Observer); - -#ifdef __cplusplus -} -#endif - -#endif /* SRC_HW_IMPL_H_ */ +#ifndef SRC_HW_IMPL_H_ +#define SRC_HW_IMPL_H_ + +#include "Arduino.h" +#include "../src-gen/StateMachine.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Setup the hardware you're using. + * Digital/Analog Ports, Sensors, Actuators, Communication */ +void hw_init(); + +/*! Poll the inputs/sensors. + * Wire inputs to the according event.*/ +void handle_in_events(StateMachine* handle); + +/*! Update your actuators, by checking the + * out event status */ +void handle_out_events(StateMachine* handle); + + +/*! Callback for outEvent1. Setting actuator. */ +void on_outEvent1(StateMachine* handle); + +/*! Callback for outEvent2. Setting actuator. */ +void on_outEvent2(StateMachine* handle); + +/*! Subscribe observer to state machine observables. + * Thus, every time they will be raised, + * the registered callback will be called. */ +void subscribe_observers(StateMachine *handle, + sc_single_subscription_observer *outEvent1Observer, + sc_single_subscription_observer *outEvent2Observer); + +#ifdef __cplusplus +} +#endif + +#endif /* SRC_HW_IMPL_H_ */ diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.c b/itemis.create.examples.integration.c.arduino.polling/src/timer_impl.c similarity index 96% rename from org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.c rename to itemis.create.examples.integration.c.arduino.polling/src/timer_impl.c index 3125d5f6..6641613f 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.c +++ b/itemis.create.examples.integration.c.arduino.polling/src/timer_impl.c @@ -1,40 +1,40 @@ -#include "timer_impl.h" - -#include "Arduino.h" - -/*! Define the max amount of used time events. - * This depends on the statechart and must be set by user! */ -#define MAX_TIMERS 10 - -/*! Timer array */ -static sc_timer_t timers[MAX_TIMERS]; - -/*! Service for timed events */ -static sc_timer_service_t timer_service; - -/*! Callback for setTimer. Creates a timer for each time event */ -void stateMachine_set_timer(StateMachine* handle, const sc_eventid evid, - const sc_integer time_ms, const sc_boolean periodic) { - sc_timer_set(&timer_service, handle, evid, time_ms, periodic); -} - -/*! Callback for unsetTimer. Removes expired timer */ -void stateMachine_unset_timer(StateMachine* handle, const sc_eventid evid) { - (void) (handle); - sc_timer_unset(&timer_service, evid); -} - -/*! Initializes the timer service */ -void timer_init() { - sc_timer_service_init(&timer_service, timers, MAX_TIMERS, - (sc_raise_time_event_fp) &stateMachine_raise_time_event); -} - -long current_millis = 0; -long last_cycle_time = 0; -/*! Updates all timer with a elapsed time calculated by millis(). */ -void handle_timer(unsigned long millis) { - last_cycle_time = current_millis; - current_millis = millis; - sc_timer_service_proceed(&timer_service, current_millis - last_cycle_time); -} +#include "timer_impl.h" + +#include "Arduino.h" + +/*! Define the max amount of used time events. + * This depends on the statechart and must be set by user! */ +#define MAX_TIMERS 10 + +/*! Timer array */ +static sc_timer_t timers[MAX_TIMERS]; + +/*! Service for timed events */ +static sc_timer_service_t timer_service; + +/*! Callback for setTimer. Creates a timer for each time event */ +void stateMachine_set_timer(StateMachine* handle, const sc_eventid evid, + const sc_integer time_ms, const sc_boolean periodic) { + sc_timer_set(&timer_service, handle, evid, time_ms, periodic); +} + +/*! Callback for unsetTimer. Removes expired timer */ +void stateMachine_unset_timer(StateMachine* handle, const sc_eventid evid) { + (void) (handle); + sc_timer_unset(&timer_service, evid); +} + +/*! Initializes the timer service */ +void timer_init() { + sc_timer_service_init(&timer_service, timers, MAX_TIMERS, + (sc_raise_time_event_fp) &stateMachine_raise_time_event); +} + +long current_millis = 0; +long last_cycle_time = 0; +/*! Updates all timer with a elapsed time calculated by millis(). */ +void handle_timer(unsigned long millis) { + last_cycle_time = current_millis; + current_millis = millis; + sc_timer_service_proceed(&timer_service, current_millis - last_cycle_time); +} diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.h b/itemis.create.examples.integration.c.arduino.polling/src/timer_impl.h similarity index 95% rename from org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.h rename to itemis.create.examples.integration.c.arduino.polling/src/timer_impl.h index 1bead537..e286dbed 100644 --- a/org.yakindu.sct.examples.integration.c.arduino.polling/src/timer_impl.h +++ b/itemis.create.examples.integration.c.arduino.polling/src/timer_impl.h @@ -1,21 +1,21 @@ -#ifndef SRC_TIMER_IMPL_H_ -#define SRC_TIMER_IMPL_H_ - -#include "../src-gen/sc_timer_service.h" -#include "../src-gen/StateMachine_required.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*! Initializes the timer service */ -void timer_init(); -/*! Updates all timer with a elapsed time calculated by millis(). */ -void handle_timer(unsigned long millis); - - -#ifdef __cplusplus -} -#endif - -#endif /* SRC_TIMER_IMPL_H_ */ +#ifndef SRC_TIMER_IMPL_H_ +#define SRC_TIMER_IMPL_H_ + +#include "../src-gen/sc_timer_service.h" +#include "../src-gen/StateMachine_required.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Initializes the timer service */ +void timer_init(); +/*! Updates all timer with a elapsed time calculated by millis(). */ +void handle_timer(unsigned long millis); + + +#ifdef __cplusplus +} +#endif + +#endif /* SRC_TIMER_IMPL_H_ */ diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/.cproject b/itemis.create.examples.lightctrl.c.arduino/.cproject similarity index 92% rename from org.yakindu.sct.examples.lightctrl.c.arduino/.cproject rename to itemis.create.examples.lightctrl.c.arduino/.cproject index 11628651..61255c16 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/.cproject +++ b/itemis.create.examples.lightctrl.c.arduino/.cproject @@ -21,8 +21,8 @@ @@ -30,8 +30,8 @@ @@ -39,8 +39,8 @@ @@ -67,7 +67,7 @@ - + diff --git a/org.yakindu.sct.examples.integration.c.arduino.polling/.gitignore b/itemis.create.examples.lightctrl.c.arduino/.gitignore similarity index 100% rename from org.yakindu.sct.examples.integration.c.arduino.polling/.gitignore rename to itemis.create.examples.lightctrl.c.arduino/.gitignore diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/.project b/itemis.create.examples.lightctrl.c.arduino/.project similarity index 96% rename from org.yakindu.sct.examples.lightctrl.c.arduino/.project rename to itemis.create.examples.lightctrl.c.arduino/.project index e042a8f3..e9fe5556 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/.project +++ b/itemis.create.examples.lightctrl.c.arduino/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.lightctrl.c.arduino + itemis.create.examples.lightctrl.c.arduino diff --git a/org.yakindu.sct.examples.elevator/css/style.css b/itemis.create.examples.lightctrl.c.arduino/css/style.css similarity index 100% rename from org.yakindu.sct.examples.elevator/css/style.css rename to itemis.create.examples.lightctrl.c.arduino/css/style.css diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg b/itemis.create.examples.lightctrl.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.lightctrl.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg rename to itemis.create.examples.lightctrl.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/index.html b/itemis.create.examples.lightctrl.c.arduino/index.html similarity index 97% rename from org.yakindu.sct.examples.lightctrl.c.arduino/index.html rename to itemis.create.examples.lightctrl.c.arduino/index.html index 42826732..8d7b832a 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/index.html +++ b/itemis.create.examples.lightctrl.c.arduino/index.html @@ -19,7 +19,7 @@

    Basic Finite State Machine for Arduino

    href="http://www.instructables.com/">instructables.com. You can read the article here. - It demonstrates how to get started with YAKINDU Statechart Tools and the + It demonstrates how to get started with Itemis CREATE and the Arduino platform and contains a timer service for the Arduino. You need to have an Arduino plugin, as described in the example "Arduino traffic light" and in the linked article. diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/main.ino b/itemis.create.examples.lightctrl.c.arduino/main.ino similarity index 100% rename from org.yakindu.sct.examples.lightctrl.c.arduino/main.ino rename to itemis.create.examples.lightctrl.c.arduino/main.ino diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/metadata.json b/itemis.create.examples.lightctrl.c.arduino/metadata.json similarity index 56% rename from org.yakindu.sct.examples.lightctrl.c.arduino/metadata.json rename to itemis.create.examples.lightctrl.c.arduino/metadata.json index 634f3a9f..44499c0c 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/metadata.json +++ b/itemis.create.examples.lightctrl.c.arduino/metadata.json @@ -1,9 +1,9 @@ { - "id": "org.yakindu.sct.examples.lightctrl.c.arduino", + "id": "itemis.create.examples.lightctrl.c.arduino", "title": "Arduino - Basic Finite State Machine (C)", "author": "itemis AG", - "description": "A very basic state machine example for the Arduino platform that switches an LED on and off. It demonstrates how to get started with YAKINDU Statechart Tools and the Arduino platform and contains a timer service for the Arduino. You need to have an Arduino plugin, as described in the \"Traffic Light Ported to Arduino\" example.", - "previewImage": "YAKINDU-Statecharts-Arduino_thumb.jpg", + "description": "A very basic state machine example for the Arduino platform that switches an LED on and off. It demonstrates how to get started with Itemis CREATE and the Arduino platform and contains a timer service for the Arduino. You need to have an Arduino plugin, as described in the \"Traffic Light Ported to Arduino\" example.", + "previewImage": "CREATE-Statecharts-Arduino_thumb.jpg", "category": [ "open source", "arduino", diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.sgen b/itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.sgen similarity index 58% rename from org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.sgen rename to itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.sgen index 7a0e2d4e..1c215b68 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.sgen +++ b/itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { statechart LightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.lightctrl.c.arduino" + targetProject = "itemis.create.examples.lightctrl.c.arduino" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.ysc b/itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.ysc similarity index 98% rename from org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.ysc rename to itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.ysc index ec019ca7..b7be30ff 100644 --- a/org.yakindu.sct.examples.lightctrl.c.arduino/model/LightCtrl.ysc +++ b/itemis.create.examples.lightctrl.c.arduino/model/LightCtrl.ysc @@ -14,7 +14,7 @@
    - + diff --git a/com.yakindu.sct.examples.msp430.blinky/.ccsproject b/itemis.create.examples.msp430.blinky/.ccsproject similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/.ccsproject rename to itemis.create.examples.msp430.blinky/.ccsproject diff --git a/itemis.create.examples.msp430.blinky/.cproject b/itemis.create.examples.msp430.blinky/.cproject new file mode 100644 index 00000000..5d29c45c --- /dev/null +++ b/itemis.create.examples.msp430.blinky/.cproject @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.yakindu.sct.examples.msp430.blinky/.gitignore b/itemis.create.examples.msp430.blinky/.gitignore similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/.gitignore rename to itemis.create.examples.msp430.blinky/.gitignore diff --git a/com.yakindu.sct.examples.msp430.blinky/.launches/msp430_sct_plugin_blink.launch b/itemis.create.examples.msp430.blinky/.launches/msp430_sct_plugin_blink.launch similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/.launches/msp430_sct_plugin_blink.launch rename to itemis.create.examples.msp430.blinky/.launches/msp430_sct_plugin_blink.launch diff --git a/com.yakindu.sct.examples.msp430.blinky/.launches/msp430_sctpro_blink.launch b/itemis.create.examples.msp430.blinky/.launches/msp430_sctpro_blink.launch similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/.launches/msp430_sctpro_blink.launch rename to itemis.create.examples.msp430.blinky/.launches/msp430_sctpro_blink.launch diff --git a/org.yakindu.sct.examples.msp430.blinky/.project b/itemis.create.examples.msp430.blinky/.project similarity index 95% rename from org.yakindu.sct.examples.msp430.blinky/.project rename to itemis.create.examples.msp430.blinky/.project index bc704715..c5e91dc7 100644 --- a/org.yakindu.sct.examples.msp430.blinky/.project +++ b/itemis.create.examples.msp430.blinky/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.msp430.blinky + itemis.create.examples.msp430.blinky diff --git a/com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.sgen b/itemis.create.examples.msp430.blinky/blinkyStateMachine.sgen similarity index 66% rename from com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.sgen rename to itemis.create.examples.msp430.blinky/blinkyStateMachine.sgen index 24c3b94b..b9a2591c 100644 --- a/com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.sgen +++ b/itemis.create.examples.msp430.blinky/blinkyStateMachine.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { statechart blinkyStateMachine { feature Outlet { - targetProject = "com.yakindu.sct.examples.msp430.blinky" + targetProject = "itemis.create.examples.msp430.blinky" targetFolder = "src-gen" libraryTargetFolder = "src" } diff --git a/com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.ysc b/itemis.create.examples.msp430.blinky/blinkyStateMachine.ysc similarity index 98% rename from com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.ysc rename to itemis.create.examples.msp430.blinky/blinkyStateMachine.ysc index b593f61a..41233ffe 100644 --- a/com.yakindu.sct.examples.msp430.blinky/blinkyStateMachine.ysc +++ b/itemis.create.examples.msp430.blinky/blinkyStateMachine.ysc @@ -16,7 +16,7 @@
    - + diff --git a/org.yakindu.sct.examples.fmu.bouncingball/css/style.css b/itemis.create.examples.msp430.blinky/css/style.css similarity index 100% rename from org.yakindu.sct.examples.fmu.bouncingball/css/style.css rename to itemis.create.examples.msp430.blinky/css/style.css diff --git a/com.yakindu.sct.examples.msp430.blinky/images/AddNeon.png b/itemis.create.examples.msp430.blinky/images/AddNeon.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/AddNeon.png rename to itemis.create.examples.msp430.blinky/images/AddNeon.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/DownloadOptions.png b/itemis.create.examples.msp430.blinky/images/DownloadOptions.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/DownloadOptions.png rename to itemis.create.examples.msp430.blinky/images/DownloadOptions.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/ShortcutPath.png b/itemis.create.examples.msp430.blinky/images/ShortcutPath.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/ShortcutPath.png rename to itemis.create.examples.msp430.blinky/images/ShortcutPath.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/addStatechart.png b/itemis.create.examples.msp430.blinky/images/addStatechart.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/addStatechart.png rename to itemis.create.examples.msp430.blinky/images/addStatechart.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/blinkyStateMachine.png b/itemis.create.examples.msp430.blinky/images/blinkyStateMachine.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/blinkyStateMachine.png rename to itemis.create.examples.msp430.blinky/images/blinkyStateMachine.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/c99.png b/itemis.create.examples.msp430.blinky/images/c99.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/c99.png rename to itemis.create.examples.msp430.blinky/images/c99.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/emptySCT.png b/itemis.create.examples.msp430.blinky/images/emptySCT.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/emptySCT.png rename to itemis.create.examples.msp430.blinky/images/emptySCT.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/installNewSoftware.png b/itemis.create.examples.msp430.blinky/images/installNewSoftware.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/installNewSoftware.png rename to itemis.create.examples.msp430.blinky/images/installNewSoftware.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/installSCT.png b/itemis.create.examples.msp430.blinky/images/installSCT.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/installSCT.png rename to itemis.create.examples.msp430.blinky/images/installSCT.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/msp430.jpg b/itemis.create.examples.msp430.blinky/images/msp430.jpg similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/msp430.jpg rename to itemis.create.examples.msp430.blinky/images/msp430.jpg diff --git a/com.yakindu.sct.examples.msp430.blinky/images/msp430_thumb.jpg b/itemis.create.examples.msp430.blinky/images/msp430_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/msp430_thumb.jpg rename to itemis.create.examples.msp430.blinky/images/msp430_thumb.jpg diff --git a/com.yakindu.sct.examples.msp430.blinky/images/proSCT.png b/itemis.create.examples.msp430.blinky/images/proSCT.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/proSCT.png rename to itemis.create.examples.msp430.blinky/images/proSCT.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/projectView.png b/itemis.create.examples.msp430.blinky/images/projectView.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/projectView.png rename to itemis.create.examples.msp430.blinky/images/projectView.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/sgen.png b/itemis.create.examples.msp430.blinky/images/sgen.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/sgen.png rename to itemis.create.examples.msp430.blinky/images/sgen.png diff --git a/com.yakindu.sct.examples.msp430.blinky/images/stateSCT.png b/itemis.create.examples.msp430.blinky/images/stateSCT.png similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/images/stateSCT.png rename to itemis.create.examples.msp430.blinky/images/stateSCT.png diff --git a/com.yakindu.sct.examples.msp430.blinky/index.html b/itemis.create.examples.msp430.blinky/index.html similarity index 92% rename from com.yakindu.sct.examples.msp430.blinky/index.html rename to itemis.create.examples.msp430.blinky/index.html index ef061d2d..078da7e2 100644 --- a/com.yakindu.sct.examples.msp430.blinky/index.html +++ b/itemis.create.examples.msp430.blinky/index.html @@ -16,14 +16,14 @@

    Overview

    This tutorial contains three parts:

    -

    1. Installing the YAKINDU Statechart Tool as a Plugin into Texas +

    1. Installing the CREATE Statechart Tool as a Plugin into Texas Instruments Code Composer Studio

    2. Adding state machines to the project

    3. Creating the Blinky example with the Professional Edition

    The whole tutorial gives you step-by-step instructions to enable you to upload the project.

    -

    Installing the YAKINDU Statechart Tool as a Plugin into Texas +

    Installing the CREATE Statechart Tool as a Plugin into Texas Instruments Code Composer Studio

    First, you need to install TIs Code Composer Studio, which you can find here:

    @@ -56,7 +56,7 @@

    Installing the YAKINDU Statechart Tool as a Plugin into Texas

    - After this, you need to get the download site of YAKINDU Statechart Tools. + After this, you need to get the download site of Itemis CREATE. Go to our download site and complete the free registration, in case you have not done this already. Then you will get a number of different @@ -68,7 +68,7 @@

    Installing the YAKINDU Statechart Tool as a Plugin into Texas

    Once again, go over to install new software. There you add the URL - you copied from our site. Choose at least the YAKINDU Statechart + you copied from our site. Choose at least the CREATE Statechart Tools Professional Edition. You will get a trial version, which lasts for 30 days. Don’t hesitate, our aren’t buying anything. If the time expired, you can still use all free Standard Edition features. @@ -83,7 +83,7 @@

    Installing the YAKINDU Statechart Tool as a Plugin into Texas needs to be restarted. Afterwards, the installation is finished.

    -

    Working with YAKINDU Statecharts Tool in CCS

    +

    Working with CREATE Statecharts Tool in CCS

    To use state machines proceed as normal and create a new CCS Project. Open the File tab, open New, click on Other and search for @@ -95,7 +95,7 @@

    Working with YAKINDU Statecharts Tool in CCS

    Now you can start working with state machines!

    -

    Working with YAKINDU Statecharts Tool Professional Edition

    +

    Working with CREATE Statecharts Tool Professional Edition

    Right click the project, open New and choose a C Statechart Model. A Wizard will be opened in which you can select your project and name your @@ -160,7 +160,7 @@

    Generate the C-Code

    and click on Code Generator Model. Choose a name for the sgen file. It is good practice to stay with the state machine name. Call it "blinkyStateMachine.sgen" for example and click on Next. Choose the desired state machine by - clicking on the checkbox. Ensure that you have chosen the YAKINDU + clicking on the checkbox. Ensure that you have chosen the CREATE SCT C Code Generator and click on Finish.

    @@ -224,7 +224,7 @@

    That’s it - Now you can build and upload the program to your

    System and Version Information

    The following tools were used in the creation of this tutorial:

    System: Windows 10

    -

    YAKINDU Statechart Tool Version: 2.9.3

    +

    CREATE Statechart Tool Version: 2.9.3

    Code Composer Version: 7.0.0.00043

    Note: The MSP430G2 Launchpad does not support Linux. @@ -232,18 +232,18 @@

    System and Version Information

    Support for Code Composer Studio Version 6

    Code Composer Studio V6 is based Eclipse Mars (4.5.) and Java 7. - Installing and running YAKINDU Statechart Tools within CCSV6 requires two steps:

    + Installing and running Itemis CREATE within CCSV6 requires two steps:

    1st: Use the Mars update site instead of the Neon update site, which you can find here. As I mentioned before, you do not need to install anything of the Mars update site. Just add the update site. - After this you are able to install YAKINDU Statechart Tools within CCS V6 as described before. - You need to get the download site of YAKINDU Statechart Tools. + After this you are able to install Itemis CREATE within CCS V6 as described before. + You need to get the download site of Itemis CREATE. Go to our download site and complete the free registration, in case you have not done this already. Then you will get a number of different installation options. Choose the black button with install from update site.

    -

    2nd: YAKINDU Statechart Tools has been added, but it won't be executed, +

    2nd: Itemis CREATE has been added, but it won't be executed, because Java 8 is missing. Therefore, if you don't already have, install a 32 bit version of Java 8. Afterwards, right click your CCS V6 shortcut and add the path of the 32 bit Java 8. For my machine it looks like this:

    diff --git a/com.yakindu.sct.examples.msp430.blinky/lnk_msp430g2553.cmd b/itemis.create.examples.msp430.blinky/lnk_msp430g2553.cmd similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/lnk_msp430g2553.cmd rename to itemis.create.examples.msp430.blinky/lnk_msp430g2553.cmd diff --git a/com.yakindu.sct.examples.msp430.blinky/main.c b/itemis.create.examples.msp430.blinky/main.c similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/main.c rename to itemis.create.examples.msp430.blinky/main.c diff --git a/com.yakindu.sct.examples.msp430.blinky/metadata.json b/itemis.create.examples.msp430.blinky/metadata.json similarity index 68% rename from com.yakindu.sct.examples.msp430.blinky/metadata.json rename to itemis.create.examples.msp430.blinky/metadata.json index 3ad19b25..1614b7cf 100644 --- a/com.yakindu.sct.examples.msp430.blinky/metadata.json +++ b/itemis.create.examples.msp430.blinky/metadata.json @@ -1,7 +1,7 @@ { - "id": "com.yakindu.sct.examples.msp430.blinky", + "id": "itemis.create.examples.msp430.blinky", "title": "MSP430 - Blinky LED (Deep C)", - "description": "Blinking LED on MSP430G2553 by using TIs Code Composer Studio and YAKINDU Statechart Tools as a plugin", + "description": "Blinking LED on MSP430G2553 by using TIs Code Composer Studio and Itemis CREATE as a plugin", "previewImage": "msp430_thumb.jpg", "author": "itemis AG", "category": [ diff --git a/com.yakindu.sct.examples.msp430.blinky/msp430g2553.h b/itemis.create.examples.msp430.blinky/msp430g2553.h similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/msp430g2553.h rename to itemis.create.examples.msp430.blinky/msp430g2553.h diff --git a/com.yakindu.sct.examples.msp430.blinky/targetConfigs/MSP430G2553.ccxml b/itemis.create.examples.msp430.blinky/targetConfigs/MSP430G2553.ccxml similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/targetConfigs/MSP430G2553.ccxml rename to itemis.create.examples.msp430.blinky/targetConfigs/MSP430G2553.ccxml diff --git a/com.yakindu.sct.examples.msp430.blinky/targetConfigs/readme.txt b/itemis.create.examples.msp430.blinky/targetConfigs/readme.txt similarity index 100% rename from com.yakindu.sct.examples.msp430.blinky/targetConfigs/readme.txt rename to itemis.create.examples.msp430.blinky/targetConfigs/readme.txt diff --git a/org.yakindu.sct.examples.raspberry.helloworld/.cproject b/itemis.create.examples.raspberry.helloworld/.cproject similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/.cproject rename to itemis.create.examples.raspberry.helloworld/.cproject diff --git a/org.yakindu.sct.examples.raspberry.helloworld/.gitignore b/itemis.create.examples.raspberry.helloworld/.gitignore similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/.gitignore rename to itemis.create.examples.raspberry.helloworld/.gitignore diff --git a/org.yakindu.sct.examples.raspberry.helloworld/.project b/itemis.create.examples.raspberry.helloworld/.project similarity index 94% rename from org.yakindu.sct.examples.raspberry.helloworld/.project rename to itemis.create.examples.raspberry.helloworld/.project index 25e0b7f4..7611841d 100644 --- a/org.yakindu.sct.examples.raspberry.helloworld/.project +++ b/itemis.create.examples.raspberry.helloworld/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.raspberry.helloworld + itemis.create.examples.raspberry.helloworld diff --git a/org.yakindu.sct.examples.hmi.cpp.arduino/css/style.css b/itemis.create.examples.raspberry.helloworld/css/style.css similarity index 100% rename from org.yakindu.sct.examples.hmi.cpp.arduino/css/style.css rename to itemis.create.examples.raspberry.helloworld/css/style.css diff --git a/org.yakindu.sct.examples.raspberry.helloworld/images/header.jpg b/itemis.create.examples.raspberry.helloworld/images/header.jpg similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/images/header.jpg rename to itemis.create.examples.raspberry.helloworld/images/header.jpg diff --git a/org.yakindu.sct.examples.raspberry.helloworld/images/sct.png b/itemis.create.examples.raspberry.helloworld/images/sct.png similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/images/sct.png rename to itemis.create.examples.raspberry.helloworld/images/sct.png diff --git a/org.yakindu.sct.examples.raspberry.helloworld/index.html b/itemis.create.examples.raspberry.helloworld/index.html similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/index.html rename to itemis.create.examples.raspberry.helloworld/index.html diff --git a/org.yakindu.sct.examples.raspberry.helloworld/metadata.json b/itemis.create.examples.raspberry.helloworld/metadata.json similarity index 87% rename from org.yakindu.sct.examples.raspberry.helloworld/metadata.json rename to itemis.create.examples.raspberry.helloworld/metadata.json index dd037f70..7ce44f0f 100644 --- a/org.yakindu.sct.examples.raspberry.helloworld/metadata.json +++ b/itemis.create.examples.raspberry.helloworld/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.raspberry.helloworld", + "id": "itemis.create.examples.raspberry.helloworld", "title": "Raspberry Pi - Hello World (C)", "description": "This example shows how to use a statechart and some C code to control a RGB LED attached to the Raspberry Pi.", "previewImage": "header.jpg", diff --git a/org.yakindu.sct.examples.raspberry.helloworld/rgb.sgen b/itemis.create.examples.raspberry.helloworld/rgb.sgen similarity index 52% rename from org.yakindu.sct.examples.raspberry.helloworld/rgb.sgen rename to itemis.create.examples.raspberry.helloworld/rgb.sgen index 32523c74..f20d7281 100644 --- a/org.yakindu.sct.examples.raspberry.helloworld/rgb.sgen +++ b/itemis.create.examples.raspberry.helloworld/rgb.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { statechart rgb { feature Outlet { - targetProject = "org.yakindu.sct.examples.raspberry.helloworld" + targetProject = "itemis.create.examples.raspberry.helloworld" targetFolder = "src-gen" libraryTargetFolder = "src" } diff --git a/org.yakindu.sct.examples.raspberry.helloworld/rgb.ysc b/itemis.create.examples.raspberry.helloworld/rgb.ysc similarity index 99% rename from org.yakindu.sct.examples.raspberry.helloworld/rgb.ysc rename to itemis.create.examples.raspberry.helloworld/rgb.ysc index 61a18212..997f8da2 100644 --- a/org.yakindu.sct.examples.raspberry.helloworld/rgb.ysc +++ b/itemis.create.examples.raspberry.helloworld/rgb.ysc @@ -27,7 +27,7 @@ - + diff --git a/org.yakindu.sct.examples.raspberry.helloworld/scutil/sc_cycle_runner.c b/itemis.create.examples.raspberry.helloworld/scutil/sc_cycle_runner.c similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/scutil/sc_cycle_runner.c rename to itemis.create.examples.raspberry.helloworld/scutil/sc_cycle_runner.c diff --git a/org.yakindu.sct.examples.raspberry.helloworld/scutil/sc_cycle_runner.h b/itemis.create.examples.raspberry.helloworld/scutil/sc_cycle_runner.h similarity index 93% rename from org.yakindu.sct.examples.raspberry.helloworld/scutil/sc_cycle_runner.h rename to itemis.create.examples.raspberry.helloworld/scutil/sc_cycle_runner.h index e696f4ee..dff809d5 100644 --- a/org.yakindu.sct.examples.raspberry.helloworld/scutil/sc_cycle_runner.h +++ b/itemis.create.examples.raspberry.helloworld/scutil/sc_cycle_runner.h @@ -14,7 +14,7 @@ extern "C" { #endif -/*! \file Defines the cycle runner interface for YAKINDU state machines. +/*! \file Defines the cycle runner interface for CREATE state machines. * A cycle runner performs a cyclic execution of the state machines runCycle function * with a fixed time interval. The implementation is based on POSIX threads and makes * use of a mutex for thread synchronization. diff --git a/org.yakindu.sct.examples.raspberry.helloworld/src/gpio_util.c b/itemis.create.examples.raspberry.helloworld/src/gpio_util.c similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/src/gpio_util.c rename to itemis.create.examples.raspberry.helloworld/src/gpio_util.c diff --git a/org.yakindu.sct.examples.raspberry.helloworld/src/gpio_util.h b/itemis.create.examples.raspberry.helloworld/src/gpio_util.h similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/src/gpio_util.h rename to itemis.create.examples.raspberry.helloworld/src/gpio_util.h diff --git a/org.yakindu.sct.examples.raspberry.helloworld/src/main.c b/itemis.create.examples.raspberry.helloworld/src/main.c similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/src/main.c rename to itemis.create.examples.raspberry.helloworld/src/main.c diff --git a/org.yakindu.sct.examples.sctunit.c/.cproject b/itemis.create.examples.sctunit.c/.cproject similarity index 94% rename from org.yakindu.sct.examples.sctunit.c/.cproject rename to itemis.create.examples.sctunit.c/.cproject index f6eeac2d..4b0aa467 100644 --- a/org.yakindu.sct.examples.sctunit.c/.cproject +++ b/itemis.create.examples.sctunit.c/.cproject @@ -18,7 +18,7 @@ - +

    Test Code Generation

    - Code generation for C code has already shown step by step in the previous example C Code Generation. This example contains a code generator c.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: c_test.sgen. The generator ID for this example is sctunit::c. You can right click the generator file and generate the code artifacts. This will generate a GTest file (.cc), which can be compiled and executed. You can change the test file and regenerate the test. + Code generation for C code has already shown step by step in the previous example C Code Generation. This example contains a code generator c.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: c_test.sgen. The generator ID for this example is sctunit::c. You can right click the generator file and generate the code artifacts. This will generate a GTest file (.cc), which can be compiled and executed. You can change the test file and regenerate the test.

    - +

    Compiling and execution

    diff --git a/org.yakindu.sct.examples.sctunit.c/metadata.json b/itemis.create.examples.sctunit.c/metadata.json similarity index 85% rename from org.yakindu.sct.examples.sctunit.c/metadata.json rename to itemis.create.examples.sctunit.c/metadata.json index 3c48e4d1..853e2ad6 100644 --- a/org.yakindu.sct.examples.sctunit.c/metadata.json +++ b/itemis.create.examples.sctunit.c/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.sctunit.c", + "id": "itemis.create.examples.sctunit.c", "title": "C Code Generation for SCTUnit with GTest", "author": "itemis AG", "description": "This example demonstrates how to generate GTests for SCTUnit tests.", diff --git a/org.yakindu.sct.examples.sctunit.c/models/c.sgen b/itemis.create.examples.sctunit.c/models/c.sgen similarity index 80% rename from org.yakindu.sct.examples.sctunit.c/models/c.sgen rename to itemis.create.examples.sctunit.c/models/c.sgen index 3a9a0f36..bb5c292a 100644 --- a/org.yakindu.sct.examples.sctunit.c/models/c.sgen +++ b/itemis.create.examples.sctunit.c/models/c.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.c" + targetProject = "itemis.create.examples.sctunit.c" targetFolder = "src-gen" } /* TODO: Should be possible using observables only. */ diff --git a/org.yakindu.sct.examples.sctunit.c/models/light_switch.ysc b/itemis.create.examples.sctunit.c/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.sctunit.c/models/light_switch.ysc rename to itemis.create.examples.sctunit.c/models/light_switch.ysc index 5647ea8b..3b1b3813 100644 --- a/org.yakindu.sct.examples.sctunit.c/models/light_switch.ysc +++ b/itemis.create.examples.sctunit.c/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.sctunit.c/tests/c_test.sgen b/itemis.create.examples.sctunit.c/tests/c_test.sgen similarity index 71% rename from org.yakindu.sct.examples.sctunit.c/tests/c_test.sgen rename to itemis.create.examples.sctunit.c/tests/c_test.sgen index 99a97930..6a9ec1ba 100644 --- a/org.yakindu.sct.examples.sctunit.c/tests/c_test.sgen +++ b/itemis.create.examples.sctunit.c/tests/c_test.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for sctunit::c { +GeneratorModel for create::sctunit::c { /* Refers to the sctunit test 'LightSwitchTest' */ test LightSwitchTest { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.c" + targetProject = "itemis.create.examples.sctunit.c" targetFolder = "src-gen" } } diff --git a/org.yakindu.sct.examples.sctunit.c/tests/light_switch_test.sctunit b/itemis.create.examples.sctunit.c/tests/light_switch_test.sctunit similarity index 100% rename from org.yakindu.sct.examples.sctunit.c/tests/light_switch_test.sctunit rename to itemis.create.examples.sctunit.c/tests/light_switch_test.sctunit diff --git a/org.yakindu.sct.examples.sctunit.cpp/.cproject b/itemis.create.examples.sctunit.cpp/.cproject similarity index 94% rename from org.yakindu.sct.examples.sctunit.cpp/.cproject rename to itemis.create.examples.sctunit.cpp/.cproject index bee621c8..7fb60da3 100644 --- a/org.yakindu.sct.examples.sctunit.cpp/.cproject +++ b/itemis.create.examples.sctunit.cpp/.cproject @@ -18,7 +18,7 @@ - +

    C++ Code Generation for SCTUnit with GTest

    Example application

    - The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit. + The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit.

    Setup Projects Properties

    Test Code Generation

    - Code generation for C++ code has already shown step by step in the previous example C++ Code Generation. This example contains a code generator cpp.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: cpp_test.sgen. The generator ID for this example is sctunit::cpp. You can right click the generator file and generate the code artifacts. This will generate a GTest file (.cc), which can be compiled and executed. You can change the test file and regenerate the test. + Code generation for C++ code has already shown step by step in the previous example C++ Code Generation. This example contains a code generator cpp.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: cpp_test.sgen. The generator ID for this example is sctunit::cpp. You can right click the generator file and generate the code artifacts. This will generate a GTest file (.cc), which can be compiled and executed. You can change the test file and regenerate the test.

    - +

    Compiling and execution

    diff --git a/org.yakindu.sct.examples.sctunit.cpp/metadata.json b/itemis.create.examples.sctunit.cpp/metadata.json similarity index 85% rename from org.yakindu.sct.examples.sctunit.cpp/metadata.json rename to itemis.create.examples.sctunit.cpp/metadata.json index 274e9a43..0dbb3c41 100644 --- a/org.yakindu.sct.examples.sctunit.cpp/metadata.json +++ b/itemis.create.examples.sctunit.cpp/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.sctunit.cpp", + "id": "itemis.create.examples.sctunit.cpp", "title": "C++ Code Generation for SCTUnit with GTest", "author": "itemis AG", "description": "This example demonstrates how to generate GTests for SCTUnit tests.", diff --git a/org.yakindu.sct.examples.sctunit.cpp/models/cpp.sgen b/itemis.create.examples.sctunit.cpp/models/cpp.sgen similarity index 80% rename from org.yakindu.sct.examples.sctunit.cpp/models/cpp.sgen rename to itemis.create.examples.sctunit.cpp/models/cpp.sgen index 6b0fb81e..821f1874 100644 --- a/org.yakindu.sct.examples.sctunit.cpp/models/cpp.sgen +++ b/itemis.create.examples.sctunit.cpp/models/cpp.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::cpp { +GeneratorModel for create::cpp { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.cpp" + targetProject = "itemis.create.examples.sctunit.cpp" targetFolder = "src-gen" } /* TODO: Should be possible using observables only. */ diff --git a/org.yakindu.sct.examples.sctunit.cpp/models/light_switch.ysc b/itemis.create.examples.sctunit.cpp/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.sctunit.cpp/models/light_switch.ysc rename to itemis.create.examples.sctunit.cpp/models/light_switch.ysc index 5647ea8b..3b1b3813 100644 --- a/org.yakindu.sct.examples.sctunit.cpp/models/light_switch.ysc +++ b/itemis.create.examples.sctunit.cpp/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.sctunit.cpp/tests/cpp_test.sgen b/itemis.create.examples.sctunit.cpp/tests/cpp_test.sgen similarity index 71% rename from org.yakindu.sct.examples.sctunit.cpp/tests/cpp_test.sgen rename to itemis.create.examples.sctunit.cpp/tests/cpp_test.sgen index 64da2599..cc2c0045 100644 --- a/org.yakindu.sct.examples.sctunit.cpp/tests/cpp_test.sgen +++ b/itemis.create.examples.sctunit.cpp/tests/cpp_test.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for sctunit::cpp { +GeneratorModel for create::sctunit::cpp { /* Refers to the sctunit test 'LightSwitchTest' */ test LightSwitchTest { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.cpp" + targetProject = "itemis.create.examples.sctunit.cpp" targetFolder = "src-gen" } } diff --git a/org.yakindu.sct.examples.sctunit.cpp/tests/light_switch_test.sctunit b/itemis.create.examples.sctunit.cpp/tests/light_switch_test.sctunit similarity index 100% rename from org.yakindu.sct.examples.sctunit.cpp/tests/light_switch_test.sctunit rename to itemis.create.examples.sctunit.cpp/tests/light_switch_test.sctunit diff --git a/org.yakindu.sct.examples.sctunit.java/.classpath b/itemis.create.examples.sctunit.java/.classpath similarity index 60% rename from org.yakindu.sct.examples.sctunit.java/.classpath rename to itemis.create.examples.sctunit.java/.classpath index e0606d4c..60cffed8 100644 --- a/org.yakindu.sct.examples.sctunit.java/.classpath +++ b/itemis.create.examples.sctunit.java/.classpath @@ -7,6 +7,9 @@ - + + + + diff --git a/org.yakindu.sct.examples.sctunit.java/.gitignore b/itemis.create.examples.sctunit.java/.gitignore similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/.gitignore rename to itemis.create.examples.sctunit.java/.gitignore diff --git a/org.yakindu.sct.examples.sctunit.java/.project b/itemis.create.examples.sctunit.java/.project similarity index 91% rename from org.yakindu.sct.examples.sctunit.java/.project rename to itemis.create.examples.sctunit.java/.project index e3301309..467cd90f 100644 --- a/org.yakindu.sct.examples.sctunit.java/.project +++ b/itemis.create.examples.sctunit.java/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.sctunit.java + itemis.create.examples.sctunit.java diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/css/style.css b/itemis.create.examples.sctunit.java/css/style.css similarity index 100% rename from org.yakindu.sct.examples.lightctrl.c.arduino/css/style.css rename to itemis.create.examples.sctunit.java/css/style.css diff --git a/org.yakindu.sct.examples.sctunit.java/images/build_path.png b/itemis.create.examples.sctunit.java/images/build_path.png similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/images/build_path.png rename to itemis.create.examples.sctunit.java/images/build_path.png diff --git a/org.yakindu.sct.examples.sctunit.java/images/model.png b/itemis.create.examples.sctunit.java/images/model.png similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/images/model.png rename to itemis.create.examples.sctunit.java/images/model.png diff --git a/org.yakindu.sct.examples.sctunit.java/images/testoutput.png b/itemis.create.examples.sctunit.java/images/testoutput.png similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/images/testoutput.png rename to itemis.create.examples.sctunit.java/images/testoutput.png diff --git a/org.yakindu.sct.examples.sctunit.java/images/watch_gears_thumb.jpg b/itemis.create.examples.sctunit.java/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/images/watch_gears_thumb.jpg rename to itemis.create.examples.sctunit.java/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.sctunit.java/index.html b/itemis.create.examples.sctunit.java/index.html similarity index 70% rename from org.yakindu.sct.examples.sctunit.java/index.html rename to itemis.create.examples.sctunit.java/index.html index d9aea16f..3a885179 100644 --- a/org.yakindu.sct.examples.sctunit.java/index.html +++ b/itemis.create.examples.sctunit.java/index.html @@ -15,7 +15,7 @@

    Java Code Generation for SCTUnit with JUnit and Mockito

    Example application

    - The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit. + The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit.

    Setup Projects Properties

    Test Code Generation

    - Code generation for Java code has already shown step by step in the previous example Java Code Generation. This example contains a code generator java.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: java_test.sgen. The generator ID for this example is sctunit::java. You can right click the generator file and generate the code artifacts. This will generate the test class, which can be executed as JUnit test. + Code generation for Java code has already shown step by step in the previous example Java Code Generation. This example contains a code generator java.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: java_test.sgen. The generator ID for this example is sctunit::java. You can right click the generator file and generate the code artifacts. This will generate the test class, which can be executed as JUnit test.

    - +

    Test execution

    diff --git a/itemis.create.examples.sctunit.java/lib/byte-buddy-1.12.19.jar b/itemis.create.examples.sctunit.java/lib/byte-buddy-1.12.19.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cd272d3dee912749d5f5739aae5838e26194277 GIT binary patch literal 3958480 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%0ALsMU$tfbDnj_DZQ1{b5UMmF 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

    X`FRvACZYPwykO^Zee*mOg_B1HU3;S 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�UYO95VLTGUo5m|xz=D5~s&;_L)R%N)D>fleS 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�L@2sKf|Ubs9&*_5KT!>u(P7#w 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%0DA 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́fEojj36 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%0Al3E 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ʳ)bEdljv|FmX8-M7Y(3_&fJxs^qFYH> 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 z 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

    vE7q{gOdLmpwEd3D4M#agI6;6mCJAAh$Usw)H- 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 oxOz!-Yp#ycNFSmA2!{FMr! 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 kc#q6v3LpQXy)Rm9?q( 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�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 #GU7Af}HM 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�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

    pJdw%=!hMl92NXx^| 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�nlK#_wUV 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

    ^wU3ui(J-rt`^a*;-+Pq0^ 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%0DZb5c0(c4;irF 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

    04-k4t^I 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 x&FO{Umx@(6li)@0^IXHYDdx#gBQ!W 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 z

    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

    ;u5>9$nOjlx&z1t zl)`Y_aN+w0Om6N;U7@SIWbfeQbk6hO7AG^!{9NwnyYdDQNus#=j$~=zZ?KQh2(fCJ zyg=A^L^VCk^_KcffTJIPNd}R~evf=MKF0c|=(qv%!2X=fF#06j{MVx6-^>z~ot*yD zEOAon^uK3`kPYON8imWMYcJHa4BZQ{$mU!?Rb%>>oCLE}pZO1dejv_AYY+Ac24_W19UKnau?2zBr^A_bhQ~Bqr#GCf98SpZ5#}b6AmXBGKwNfVKQ_YdGd~yGx@JDBy%E~)-lB~KY$&t^ zV0nR~xhYnYs3vP>dIX=uB(*%=u*AlHW9=P-Gi|$V(R9bQZ6{A`+qP}n9X+va+qP{R z9dvAT*h!zf->TYm>N~Z*b@n;?$NlsAb5~t+&T)+~$GFS{G-YNS4`ppAtqLcp539$V zWzrwHxhRdWCvKw!MIr^yg&J}85|65`G~1{*VRjT5LyEY<`qB&v7n+)LHlRnK@q{rZ zjUzy;WC7qfF#Bt~Ja(?47S9&J7KDT4L*Ll!g$cq3m7h7}F zo;XW*z;_zhc?d2zL~u)t%rp69Ha1krCvx7UFTU;dGg0mr50cGjK6y_&i~>0|Ut z`e!_3$yKh{Lj^$Isd**(#%Srlw;_Mg^I{PzVoyhshqU>lR%n^46huQ zz}&n>u#T&%h=(*&lO>k+BtB(}a-=~axN}-8xf3#$YKQfms-nuKyw=xf0Mv6Gw8@Gj zx^GAQ0j~20S=wjS<_%lB)2B3u>Yx_MQDOc@sq1jDmC`jyb-bjV@8aowKO|+fysE*C z=^5i$m2pw)0qPUG6N9ykispTQR%~g(MOQRFd?~Xg0kQ+1Lv9Klf|@X!d4v+En7PCX zFhRd!&07Z7v|tkiCq$T6vMw15bALmO+Dh!b9y+KkZp*X$2uD8RpRq3t^%o>Ux%xl` zrR97LH>ZCQtzICYLVii1;xBpi_n_Pzpcae;V@@j4hg-Uyv&5sT%Pvisv#Q=JPv(+D zBYt4sBvYok$GYJk)ok_vPm23B%GMAJMI(Z4EMnGB(6}DYDpf%Eo07mY*S!teh4i~S z&EhlKjTpC19!UoUvFy1ZcCZ5W7`xebo)jr+tNtT88JI(qSxG4)Wp0MY`|S;7cT3uZ zvb$bNzszg~t3JUFf~y!_;(dj9vUh(fnP+HGawVfJaTM%Y!%-2!!nS##h}FUw$!0!= zmgrJL42_6cKp3Jm6G;o!!`whS@B+nzfY2L@BRrTl9O2$6ul|P8cbX{L52#9CO<_dJ zAcEZrYGqnnfWN01FU(UPPRA7z0rot5!seA2C`#5Dv<=$a!W%8xC!upObb8}_4;M4Eqy5w-EQnOTx(P8CKzXC>~FlD6jGrzN!;M@+HvXJSpcNsCR?}2w;80>ZV z9|U_7p(F3VjJWWQ_5Hfb*-37t1~%tr@8o1mKXgBP9M=W-f8h7)`;Iwoqt#~Cb&}km z!>Fk-YQQOBluqgGFt0T8)50um-wqpYHkL_uqRNWXq8nj^)cjzo&f4c_w{~nQ&z+lt zno*mdbu6cD_#@H;Bg`ij%!ES+a0finjqlJ;U?Z5PE*|miP?cMBsN4^j6T9sk0$m1f zBRjd$nPs+@MHBb?t*2Fx%(1MIEAq35JF#Z#`>5T0CtMw;ne~`tD znoHKs{tVXopxCI-B_@-Ya&?$kfMKU!>Y-K~h${BM|L7*OE$!N_*dqtd8g|p&zzi!tVF>gmt5m6C|oHk&h+3%>Yg+jo2}U zy3J-Ha}Cn~S3}-`Dley4jPUxXx4rZM{6gKnV#7aTkqNL0 z1ezR$?Fc%t=FqB@KS}@eauXDoTteuf;`YPvM;uV_NA9U?Cywj5E`yinM%yPsFjJPA z_9i7Ur;f(F{;6ZM&wG^BV1&iS)o$;%lkY`-Dz_Ev&62u0ZI|*}PouKLnb6LyiD+hk zZlxpF3@J)o7pF;(I6F%TW6~QCdEAO1)_%=4x7u6~|0(HyC4@cq8kJ$O0;k;AJKHR$fAuzt5@2HK`cVKpp6$RcB458O=!o7tO2@Fn_{ig2A z_)7}e%1_=TZ|%UXi#Hi3!q1Hqkd4^7Ge0z#SGGvD$HzVJM|WUDAlyzkfZYW4%^g_r z!gI$w^G-dw#dCyD8>C_Nm!sDP%~!?%`!~a$!9QT&G$av*`Kwm@!2cfv1OKa5|2ryI zmr+3#Li(hD)@mI7(T#Q&Dh>^%?*}Ujir3RnZgL#U8 zV27e~iaDL4B zmNdSe<%Z&+Bq>cW$5=rVi76Y%DRMoEM`We4Njech`W3e@A|Bnk$E5@G5Pu^9p&uaw zxEbrFx8%}apu9A6!azMr%iiqKHjwq>Oj(}M_B=JdvFdRHEy#$;&RJ(_)i$>VM_dkd z#5oYN!|I}yDnncO(s_s&g@2N!)G+YC!rIK}7~7rHqG%kGi=<2mfyBYu$zor099Sb`v>NYa`$o)kbzcGg~2WGICp*>=Be4%kAYa+8Hy+c8ExF>MmZ^?Hh# zB_aqOv%}>*<|!D+Po~#jr9a0hVnZ%6KNm|_qT%xM=~4wWCu=p-RD$h8q=e>;7xqAk zp@A7 z_ssGe2+VlL@U;|xv@2{*%&BE=AksDBlLLOlU>Xo!|eCOHSh)#@K8PDoSX zcPt-m$wTNBC(ft{61{Lj19GnV*6y}INf)A@_$H|hOmi2U`$e!$!25pdPq`30^{8qE z?gN?9BOx#`&`AveI9*p{=>kv(-7QwiikHa;zJLh4p9*f*W_2Jrd!UmdR0r8$k=p<- z+K&cn6WCr!T|s`TKSFk5J?;Np6@8Xbc$yF*sMTRl5J9tv-euVy(8F{{P`5gYXf^ib z58Agf_Cy-xgFNIP)r-bd703wo1~HQ{-`a`%eI!|GjVfbjUfG%9jpW2jSze$2H-_OP z*<12{;Tokzq!{0yT{wUss{IU6@H1-q9rVA{iCARQVozT(u(B_9_P@v6%Kv+>U;i}@ zsknYwTbTUI_+Qw|)l9^})J(|H(ahe|%=zE0-;BnY3#u8`-yW;UMAmsn7-b&&Wi}-qEO$Ly+ddAsJ zdf|bW)mHo3R5_bGjIFjREZn|d)hmE~3O+>#1xv(HoU3ZQ(^z&2H3B=gnYfcUI}EIZ=XdEP~ISr17}T#3xXLT|i7)gC#{^a%!cj z1I-V#b5oYGG|}{qN;Z;^>s)9wv+QTJ<(C=No<*|zp(q?LM5D|yoY~}JsmvpBUuS$9 zi7jH$lX{*~-zvS*`G?p@FQt+VntWTP5~BheAvvj%H?6t3n$$pAwCr;Dbnn33avAFv z^~~P6srCfQ-}g$AgIOXJb|yMT3FA|Sun8)6<{5ggakkC$E;#%NTq#Tw7LjrS6lh|Y z3LRHC$O{(-pan|E(fDqj?7c37YO=;4JCJXtQ1X-v5v`yyv2)qeop|a9^^vOOFBC_6 z2|2kdldVIv`k?!PE|?*fRji9837b96NT{cTFr!-aq#iKI1KI#BvAv>P*RA8qR8zh6 zD-%szs6^7G&@p7I78L7gwRRnLmUQ{o8Pmvoqt^~s;eFe%yiJE9qKLtenStWX65P!0 zT>nr^(ikp_Wwi^;P=4!-fEPGhGPCOqs?o^7pQDJkZ$ zmTY`jLy%y*c&6b!jcv5EE8-&yA69Ibr6(SY3MP%Jsb2S(u? zd4OdZKwleg*id;}CBOpeiBPtQ1Vrg4xI`CHV4J0FOwo1JsIyES6Pg*{P}djSt`y>n zDWw#vOq_u^`OrFx#~w*c(G@2+bl+4hYtA;$QaAftbHl7uV`WD0PLR^tFJFRf>-jc< z5he6UJGsmK59pUYnP zCNiL)J9_CXv2_vQdg*DPT>HvWlf7`-DH3&uwuue)%5>x~__uR%q$&~9mpJ)|eM-Mj z{dm3$B*b)*Qq(WhzEN%&tLTY75&OwSoJsM@YEOagC*8o>z+i9BpUYuOKO{!AFv>Ji zr~~?Y!+!{%S0dHZUoM1w;P|WgQ6bZdcA|n9wg1ie2MYJLg0PQ}d7)Fuskk73s@51p z+bXVGuqBFDsIV%VH9Ar99KdzJW8~bB19;=}qeo%f!Ordt#p~pnz3; zNGCji89_@^qg-{yu3@NYk%aU8O!*-LyN9Ar3CnEp1T2b9*Xz#$8x;jxhy{s5&f!cV zU2s@9??L&%uc6l zBp05+T5?^`5NFQQ&4143w+`=AbazPX?SGUmGk8=ukorB~UpzB} z{12O1$wrv2w~|T%@_@|Y-PaAUX)o4^$e9GP;i^IgU!wx|!QZr!(W)LX$0>?V;6tQ@I&Y z4^Ceti#+}~3Sr&2wPBbmw>hHb=!gCJlMwJ~fAUB=`>@hYT!9*Vd2hLEk&9P~5T;R6{k@SrV9`MhH=AiKn|DZE;dNTz@rK?l z{U(Ru0ycf?*4_!$5KlIudS8;uzVdCuv8s=$H9mODpi0Fzb85W4Pe^P+bBpb1FF+;p z`$eL?1%xz>-?L@*nqCfHuc@RqEmzbDYg8eHTCHQH$-n!nPFWQ9%`D%B2ATgF zixJl55Mj^>0MYX#`7zd@G_V1}8UiXwgwju8i<(C!qR`_`Bgu403oDtcpzST+I2|rs zFzLhC# z?aqOujg|m^Cd0(XiigX|#VjRdW$bLo%s&oz4woKK6?>_}8&A%kisK^JaW3ip3R8t= zoCS4Gw1;;;M$@2+?&WhA$TcXX#)plQg*}sbEjSi2*?Oe1!S&ieMn!S$RGV3kz%N zagXt`&Y)E%E%Buf6)UOq+xOO!`{tUlZw|^NOpuL2~PNOM_e08NnG>JT>BF{b8zPlgnytc=yxVjCq;NIldYCF5B3_J zclXA&wyWI0(&M=;B)%Z)0-p&eyYgQq?_%$HDHqp=eE+a^pyCz`rNm?rwPG~fXr&y=|vevE-jR2Eee#SJc-R>=5atb30KwZr%P4v->ACqg zd}L!ClAPVHTT%C2a2>%@BDcMcSd2M%;f@IRxil23xFId!^M3aba%IR)WMuCS3bu({ z!RJM9G#=eYr)EwY#C%x^4^jVbMSWqH?-e1tBxK&b+NL^eqLJX2&Lw%o`UOL)r=TyT zp?gn;x`x}qe>IwCNQoex8!Dk;9jm}YPH?}#y)kObclTh@Qm`&`8gHl&eY{^_khbC3 z#N|PV_1@elJ#lQ!{BedI!~zV7Saecw#*9ya;C}0I7J3ntq9B=}$4ADl)D(M2dtAi8 z^gM~b%+u8n=I2WVL^K1wk*!jv94Ha9haWnY_MP|8w^^vf4kr1B&I^OKld>~!Lj_!!#Nx+b!dG(p-Ej+xlgxqN?%<(VNWV% z6z6VRm2b@eG8dRf5HG)8b!GIqh-0r~vbYSK?WL|f9Yuu7%>*pKM{-}j?` zYeOyCR)(r8=%4bE%+pijD61eNAWBKtL_dOH!cB=$WPc<|Vk_>O9g}+jG9sD`g{^8z zQW!Qz7}Pg6(JzH{q|KPqJDW?gb~w6jd|K46dY`*)dQ4NlNQZSoFAuKgT%RYG>m1&v zJV-)_dSwJy23Xv?&DhWOg#;*wcbl2q-S`EQkVEh7=&y9dX@1gn6-074Oi_ScpTA-q z{MlDbr5*lzjNo>t)c2p@N~{*}dQ`}=az%Qz02uW))5BBA^a8^xbH3FbBxoGB{k>8h z6mP0lzT{KpA+@Z*9dAy99-SX4t5q3ro9pqj=utn~!jFir>JAHZj;LLZ3eMjWbExscb3% znXMGUBFvc}%%&XF8`G#9-Jc@DldS23evlyUKCF?b9M?-LGW}(1A=_G$B%q@XVgoPfjqX~rX1D$`s6z5`(26}qLIVG`MGs4O<%}6EZFau#* zf{a7S9oSk&e)k8e^VvR82)6?4NYtTg@hBlMYq1LYx`k6=ZN!JCVC`M^X(D$v=+`;* zQ*lZ7dJ;rAPrnx(|0-C3!j82PdYn%UCtwX~eRrte5#S>)pBYUL&mv~oHRuX;%5}$$ zy4d$rt3tks1>?Bb&v#zt9yn;==$P+^O6X9jr@Lvgb%Ewf=pUZ(FHo`ph2xcbPYpP zRyeTY)T}3S2nf5--85H^R+D4J#Oy=pSzB}Z{kx(wZ#i+G4*1g2<#H1Vo2z+-|L7`$ z&z`CQ99S2hCozHzX9y-!C;GSpi%l}aR5X69L(!Q#g2v)Sm4`w|*4CXeJmUZ|M3MX7 zCplAVGzm|xYsaLQqM%ji^jRp}R@=jrNp^km^h9D=5~qFnK%D}asD|C(wY?Uc>%j}O zpEIb3@Af0lxZA_-tW(Teouo?AuQRevOe=DEKaU4=9P5BSj?*)UZ8PJ06*_U}f$f#m zyYiEuc%>ffp0^0yDnovrX<2ziTCImv>!Hue4d$GO{pN`Bd;aiacl;az5>3U+C`v}B z!MwD?`rbYzqj@EQgg*{&yOv@-IU66>!e@(#?HEq^cZvU=ZI z`HBy5`Kmk01@f+kFUk7qGc9m3QS|2TGx;va1&t36K3I5l^}fSQEv(92Wwo(g@94I* zG=w@8+LtYRG7mi5E((xzh<4pX?=Vy$_`RA=&b{%*1oAb_r$ zYS3T?K9Ohhg6uEU!7Z&+uo-NyasSDtM`ise9)pE#%ETg&v|PS`O;VHkgC6?>qfdp| zo20CoDw|y5OknheO*gCzE6g($na#8Be$VPfE#-G~rBe;=;IwXN&9l8`nQuV5A!>45 zu>^p!O}J8HjTfEaZ{@zj`mFU&nuscjL&D38)sIw;%mwKxWEBL4#yiG8ItA}@UUiB* z4HhZXahiuEpeaU^VmQ3aq1p%+d|WuLtI+Cb=YNI|hvTBP;->o#%`B5Mf+~G^ zC3d94emBYPX8U4a?#}!qAOd2}O2E_%s7!Nd-1!dIis8}q*tRpd` zBzA$i*6Ag>llby|1go*3EbpOm6FpuwIzBtA5auy#UP(!>rc&?E6UrRNQ_R5d@!PC& zU`J#p3b$9efvJc+*iM~<7x_&^3+S>ui}@(2$%>tt{An&vv?s}Vw`v_d=K$ivb;3$xscdaLt=es?tn%%a zFr(`U>XA!L&_mC2bRTO{m6;uODpbpUqrWI1n4kk9Y^q+H9U#iOK0st#+=aYL$-(F;|i=5&gz+~ay0on`XDJw=-+vchjg6RJ=& zjmV~#wECjwQEEH0?xo(bkn8$!7_FGdi;*=*5iY+@BBgB0ydiIW>u%sSyJhC~fN{>1 zk|=*tUAPp-9Qd{^`_WQMAh}em9ERk(LF&EFu^PP3^GRxV#U59g#4Z#EvB$4=74q-& zlf4MVOkg;259Tcp{irYbj^s$@4`?~$4L^xW-yj!`D95q-Kb=WKZ$a$2j%ed@`gy_0 z$wnv8-X=|k`b8)KYu^Z@4@RiFFIn}OerTY&YT&qPpwubs$CTYs;JPZ{xGJDHvJIdyW633g-0sG|`t`o=@(xAkA zFbmWnlc*=t%?P6tY_4M5_G6mzuo*u}BNU_=ynTw?DXPF*32xXg0D=w#YZgRlx@y(R-FiZaP1PqsFDl0s5s_Zt+M7J_V0ZBK$+PvhZ>B6IwlADb7hmxFub~` z#BtZSr>=gSrQ)#2u|OXAu!LvE3dnSbEi+uYBiR)XQLSGZi77|zHZjWpU|JC^4722H zo6y-aNL}!4eefEsk9*)T5hr>3NV~Bce;8+_B}Y+reyi{`MLPQQ0&OJo>qncKQxSDc zwQd`anrKCpxm26EtHtgiX%JuKk?fj(2{PH&>EzqPt#de%oSS5OU5#3_$$Vf`2Ckb6E52x2W-zy zr>0EMHeh?CBFK(XtuQ@&YOWUi+|$NQ-s#BTBtHJ^&d3&3>^Dy|*O8P`BMvDemp0H_ z@C0AcwKi?cn&}L<^KXIUVk$O^wYM+JH82RRjKb(jf72axg7?*&bmvkxB;UDku5R6= zbz)o9KOgmut=oUmuH71MC5V9o*aLgSE63==lJCd&VDWj1oIn5NiS)Np^qTmK_JySU zPn;CX{{+G$ja)4MA)VyRTrC|;{~xXyDbaHOxMqa@v}|dC!RY=0>rpts5?%=Fv=6=L zeu`*CLV@0$35&Q_FdR;sHfyqL0vvnx-5~@~#{xo$z(L(jG^a(kr5F#IQrdN}a}lnm zP#CP<(?B1_%qBOaF!bIaF&PzXL_8jI+CBWCs64K2H@YgWipJ>6-iQQj+RUW2B(64+ zlMyy6Dq|j`uV!-%{y{Wm1}_M{aqZcw1L4d2_O?sf*Kjjm7BA}X4R%PJPd2L2(rovLr{_nGp z1*7(%Gf_Jm3KLD}A$4LfjObIH-^a!F@N9Wp0OMgjbhGbO7DtpE2fx;QVZKdxMw)c= zAN)B~p8y4mwVAWvif2oTkebl05#36y&UNif+#p`6v}*#o(b_jdWhX170rBA|h!5UthDqVl&ie8@jEo-kOhaw#sK; zzsHaxRcaFDLo9!%cWDx}i}T{Y>D446BMxLM@szY+&$wJl(lRkoZ$qU?y}E&UeWXDs ze!9SBs-tfUJcRu0X0n{))>!eSSvjS!QPdbRg>1$#^z3d*UR8 z9!nA{xdAe&CZ}dR0{(8<4lSD2nk;);R;)~CZcs_f)nBt(do77tHTBKJ)dk4J?zPG9 zxzsx`h)eLBf41CSR1#y*Lfc!<&=VSrYnDH`zm?g~ddH#DG`DB1K0|lEOy;~vuV4Nx z^YVIa?0n;gx8tM_LNdnDu4jh>x3Ki2UzI8s8It1E61K4B1iv7EI>d2iSlK{V_QT+_J=eUrs+@L&T!C#Ww3YDg=)Sx2EtSw9)M)dJOGx zhw5HiD9NihpgSg6I!mw^=1a;hDj+;j-M8)5-;1xvWlojF5%E?w#gLmM_wUihTk?S-Ngnf9&?D_TUv?&3MaYKl_IF3 z=R<5@ZAmE6Vky}lUj~n%_*Qf4PZdU9A|=;u6`*1$wIhpikQ-J!EC)@uljWN$P)5p$ zNyqm9glpS!Y-%NsV#ICh6o$pr+4ri4m)H#P`!#6AUeE+DCFWqJ`uOD0;^dL3dXdz5 z81IfNKIF+VYY|u<6K%)&NDVPBwB%rj8!SaLnUpWaJ)m>fO0#_U#mi0C>yy}V=Ki+5 z@n*x`l5GImv02L+kXTK7+<#+ADb%*pAx!a-9_iXpK0aYUzu5=JtLrI&Wyb8r#8lt^ z-W@mP#$-@K7;ebJFA2t%K&2QkJC61~)GmqQFWT8+v(8PbX{a@uz8leCn3MU6#m~?n zKwNKm+#9LTK#RSaBQM?zj51U8#mOs>OkJBl>5?Q02Fl!NMR;WNcOD#Y%{E@1r)II7 zycyOWJamKm#OAYT%E(Q3=vuyf@5LH8dRhG3O;3{L4l*YpV68GJU^mX`vBTZ!e9rQF z9tbhkji?%I|89V8NnfD{m)K~Z)tEQ_JI0_4m}tefaFG&{ijAxu8RWiq4%Hjz@Fx9i zo!$=~DpvSttx+xeeqBqw&DPEyMB0$FYk})6JoH6*z*N;oi5ul67*!eRQba(xH$5}w z)aoi)x9fM>^F1N0xpqq~-{J>ci3e^PSN2AJ3CM1^aC#|+F1ud%-Ow*C&+M*r=eC!$ zmBn^t4rhHnkpy54v9<>_R%|nWdLaLH9$ZgMiCS#A#QtuEOzvrm{*6PuTEO zm>Le&chDEM+s!igz!HcsWb@}fOlW1KsEG(U3)|-VE`j0Y96Ju%@IKg%`8=g=5kDb2 z1p4`#5KZ$My@XzCiJc<2A__a@NM>k=`9l3LK{x0L1sC5?bHqfpo7xXoYjwn!SwtYv zK=hW=e*$v~?<>(TiYC{1J{5yt>8z)VA9ZxeGj*i2wjS}>Z~qm_`Yx!yQEwUpA`GEF zr5V%*II;#$gs2-PcAbUxMV!r>({iykNJ>gCa$}5@D2#v4VFuje>g=~o98`~;J2d{< z)ao!J`!l3TagrD?K1I#SOuK~r?p1@Hr|_#vZRQ1e3e3VYZ+iU^1CUIaac$Xj#MkfF zE<%V8D7Km?Ozi#jJB-=!+=4wu7(K-|Eux-c(kUUNQj!&~T?#A`3KmaMurv~sl_~C% z1|vK)(Y!#geGISBRh*V5J-(P+i^ngYg?6Z8?JsA2IUjzSf#4rsG&+VU15;rHc7%&r z?b;0HVgb*ysZ}e)A^Vo~q+{0F5xS?@Tuq3wgk0CvSlqJAL?PC^0aor*_|Q5fn$*6i zUrA_th0LqNqo)f?TB*cwDRN627b!Ne9T)S>Wr^1 z>p)1klNmA5IdnKMBu(zRMgCf8QSdnCR|B+PHz>I}`&}}CsFg!*5B_`F-X0%kTL2>a zbDW3)8sU)Q5|;R=VT{R?-0%d<<**LLEkdZA1HpCIz0h?9(%L5FtrECJN(}-M|3sLwShMl>G)d^|)cF%IdvVj4^L>x&(KNqAOH0b$R8WsY z9WFrS^=KOY30D(Lk%g;AN**)OtWEbVaPV-D$LT_?d^1?&J!{lyEK}OK zD!YFtsap8kZ~H&C(&2du_9)K0Tz;wt{2iTtD$_KimQVil@M#L`tvpGH9KNU> zBAdKiVSNh5d}dVCWKX_su_e_mKw4$`oMJo|s&^ocQ9l>Sc!7va20JE))vI}7VbaF! zNgpZcR`CLHlgFIe?nA<<6e7#-lPy(qF{)B5M6>RzPnB{}{U#rTHS}+{D{)gug0Mbg z1M(9QvvF@pKB3h*1!q^FK4AZ*){38!chl`i*<#)k%9~-K(1r+?!QOr2RtPx_KgwOQ z8h(Bf&48oG5DLm)7sgCNuwrG^kGP+Y9o13PZ!I#C6~%e=2<0e-fi3q z5dbtcHg@ilYOJY%Mhp!(F=OYl!}o;8V$QzT|NRzQ5U&CWZF^-tG(A!r{h3vjlp*XI z$$K7GnDE+$^--fhopj6o>{f6@1RWY!sY=1ak%_Iqyll!lrM;I*S;~8j1?N5a<*ILg z_uH*uHs3Uor3$XdN~gVHyOh>B*T{Bsda#llX3)LE2IFd-)xdy&5$B-6F)d2G7>|X7 zn5q&-3rlW}vI)*)ZVrT@omfoNiDc6s!!xqkuv{*yb=)&F+ws_QmL%dFGE>VmJ+4&a z1tLysTR+lFZ>%{D<;nu7lRM$p8cAdcIa>J&_SY3d zmTH#bs%~S)1y=}KxU?965+lkvBb-1)kLF%9$I!0quNM#tafw-)*4e_ajcYRNpY^cnOBCYEEC+H0MpId zZnb9WA&AXKgLRe;^aPIz7(d9Zae?=UBJQ4SHQ|v*C-7GnM6qK$m!V%6IdypkW82JQ z!Adj@sDh?5YxntlGPARQVFeUj?@8L2&H%#V2e7W8`M-HyvBPILbr5V&G~(K(bs#50 zjUs1l`6M9}x@2}NHML80gm$>LnCJ#bo)WY`44h!)G5vTytQzunebpBN?VQCsf)s;% z$@fU+clNi{=Nd=oG(SE!=9rmJ2WmmayVFzKEfL2H#%r2dsdG`~&21trFb)~fPRmsG zN%rL-G<5_+DsniW&fi~M?!`BDqB6aAiFKVZm3kq&1kM3&U>`Ki@4rfX1Og|^ev>Ab zxoI0Bp19}J=2@bz19Nx2ZM}7T!x0L`E-$SFlU6$wEED)S0G>HSRyP1L3+eW~RtVqD z0};r?y?BrR51ho{r}seoTDFAvkHSx#|4oqnZ&y*x#me47+Re_9Ovv2T%vs9b#nsu( z#MR2d{@*XCx{d~}8rmlUSSj|Ru+Y4BQCc%Rw3%f?A-K|HO+|s&ch&N=+-bbTf+Q(! zOxyFTjlOvgzw=;sYW20n5`~qwJl$&+sX#JtWm7Y=S+@Y6fcMLuIj{Shx;{|OxH@bM zyM3#SL`vpfqhwYVgJx0vb%N*Vpc=h>d;3DeaIO6#81ctU2Q8WH`;q85eA3R-O!ueC zJVx;`4ZeLcyEPYIJs288xTG%ODe#>9mgceFTTR>SQN8GNVq+{|!)`as9$!KbV68O| z#Oe#TMSFUsdiCP6)2fz%Sg$qlE)ru z);{wKrSWa?6TgsXI^Gk(3)~J)qEhJTUME>Sp4)yw&Dn`r zU@Zi$2PZ9-Y2@069M68UF!2n4yFnEikbxtHRvGIq04Uu`<3H$uqj!r>(=Ng#Tro`p z8W2w;%J6eBSq3rWLl>cePni?kgt&t%_)S=Q-X(?e7^f^9Y}h#roE6_WLWnWZM6n@q z5rqb@fkSElIQ$m$9|bE@8TPL6M%->l-{c~;xUDx!IY#57@!?E=DuX$Z4O$L@h`7jp zDV@qmLLSig6G4VzKo`_BNFo$q88K>5hCZ~pZMGNMv(_flWlC+l!7WTZcyjSYN&UKH zt`dSxiznUm+U;E}<71Wak`FzIvJbG0VnhMaZK}k6{biJZ0@GPDw(Q`b%ILYCHeewg0d4%lWQHygR`VGiGs_kF#c}{ z!8#N9#y>x#2T~)}SZsvLbjUtjSD$5Na6Rz!ozdx(#a%eeI$c$=V|Qd%CXw6di92GJ zxBJ6rQtM?W4ik&0Wt!flbMdiiCcl$HuUMxdyPy(Qd~tVY!|J8Sbu7^zecS(Rqre=B z&FdUH`ggVbiUUeAxoTW&cYE3V6pulNjmA@nrA?wd@!Mi~5PnOdIBu8Kr&&5| z)uZYHPREkjO&$vtn;%0W9;;}~Y)$;U4czZPGf#(Tj17Jj@K;{t4#EMV1e zC{>N33J690jfNGNFNY?7Yh5I$7jTMu<2%yB8pIWxPqK{m$GkHKzrdYm$=KW%{Uc!+ z=V%3b^ZRd*l=mR-@QOtH>OJl(1IN-buZTC-a)+SHnS|y>KP6(qtG~+KR58va6Q9gq zVUBm)o=a$m3W4EI=x8o|^(L!nfGgIb<~ejV3QW?NWDToL2$alWi{}APa|i($K~c%8 zkT2*f*he2cgsH;;BCAqU;GiEDx;K(wfP8@1B5Mii5tqjJ6NL5;hVRbo^}7pMQIH3D zJ2W!vhp=z@V(Gr<1N*B`p}R7s0iCz*cy{O^`NBgcq;Hu8TJG9YXAM^J|XoV*Iab}PnBU|Gjj)L zv;V#hx2Ws5Y>A?MvbPp(I^j|l1UkwvT3@U;OQUWI<9+X7XOKrtTulZkp|!%L9dBGH z3C8w^MDz4!{XS?pNDxuN!5vhTM&BHdQ_3-1wecN(X%Yo~i?3C>mCD z4XHb0GdK;jT4k-$Z4uMrMtJiM*9TSLwlCcTd;~Y$tGBQ+4o3ZE_=} z(pceg>N|++K76$|lvDtZHY%WP)dfK5Y~6O;y~21@TN{SSoL9>WZr`4?Q=*At0XHLb zH;)lHhf;)nK=|ryn?}4=nK1jH+OKLh22zj8qvRuafa6SXITC$zDQy^rW{muZS! zMM1<6C1*1LzjcK5`rg7xL>65hvY?gqs}igS(2jN2x?A+ zaMLiue14f)YYXGETy2$?kRz`OVGEb7) zgR1;IQP;3$3GxwOb}6zU7pa`nXryNdWKJF$eVo(3;<9ddlkAiyDLyGTKKC{DI_stK zJnnLrEmHSA#}&BQpmOC;y56MkA2j2CVOIR+z+BV7HviPQA#=i?a_SD}y`#QKjo;r6 z*m`y5T{q8X5e*5$`Bnyd&sMduy|JkN+s)w46<;f@GN;t!_TUv5yI^IVvE1q<0#{0=U3@-h z#rXWs{nEW8GIl4nKm{j_x9t+?iIcO1pd+NBMuu%2-8L)pdPOEqw*(uhE-o)~K1bgw zy5e5ehEY9vH{|Q;LscAQTcTh7fNp;70#g8Q#z4Mm>82Lb-_~395IdX+D96ZhD#_` zIl=|~=jbd{R5J3ucn6By19~90d1FPwY{s`gyXl!#CRR6Z3hj3yQ4?R!+`o_^wD4(s zqM@I_U@xu4FI7p+qc)g#C4`vE7GUgAz9+2|cl}B)x-_HErg+CUUdXv53>R}}cJoay zx!9T~BH8#kFVe=%?@d)!$V1#Ll}6(7DM&*TwL9(08vPv(d49~zHx-B8O!(R787CJR z>Mbuwc#zzwn?uSkQ4q!n?f^XdGUeR~j4|nhMt|(|m2&}aprYIt`bh=3sGTqpc?e_Y zohqF!wlTuwzr@{zu=H9|U$spW_CKLL>HkBu?cXNK7B!u(}7ffIe@~JrsVkbhnT?+^Sx{_bKfaGm8-n{QZ~hG(CyF zsh%gRA6@EB3rVw!J^4+AflO$ruW7n%9ZkgofYi`48%Y-3 zi#!97RHNdxqe7TL$C3>h8?ePz_VrRcn`^CpJBI;;)MAxvm(6V^v6zB4!evV=HdHNrSS{aEq4(!_0H)vIRrec{Rb%HS`<}f(9wISq9TC618CLaW)&0sig`+N*S{! ziv8f{NE)DdL;SxTU8P?mOU=rR`Y$jY$ z&+aVtmK>)XI~ASe1Us&Hlc9!SRI~V67ptf))pwG1Fl`48;bG?Nl4-6oJ)K7egi_4d zc|k7DNK_ZEs7#C)a)M2TT{1cK5_$$L&xq}vB#tK#p94%zIwhm-gE)`F+^Cty7jRh)jn z_l9LSu|)eR?RTc!uWDOFJ(m?TR;KzU!q%>)IXFi3@)d?aLiq+U-$HZnWUtzihAE=l zn2IHU6ZGnOAwJXEF#8~4TZJMV#WA+YeBQChp+pxN`;0H7p>Ng$B_>}oQOJZc1a}>K zXofba$2V3h`-ZTbgassM;)nOw4`+(Z_y9|5jbKy)u)pr-y2z@yPXoVNfBf4KK?47+ zNcmfk6vPO=@8Sy3*IZN;5m7|tbpDpyv_%Ce%RnX8CGl&04WUY-<;c#uNB?RQ@mw4m z76+9#xtMp<`tq{lKt^9LEAwMr)tTW+FM@EheLk+E<$lk(3PXI0l;Uy>&j`hpf~iL5 z2r+9j(^X$Dop1*MA_@e1wqrVqaO+f?TKKy}yB2jv2=jcjap{M_}AngLO>bd)V(I zUD3Ul9G*}96d-Ese02cXqhAVobF{z8=QkH+z$3MVy4Q7p&1Xdhe%qfL)Za!0;x8m`X69__0^GFaW(j;gN(!9*E8=NqXlrTwK27qy4*c7XRS(1(6;X>xCyDE!p&+WJ1ga!|RBNpr>kTE2(bX=Q1QP6scdodJM{dxed^7owFu+@w6*x<8r%&BpOMK7U1~JU1*Q?W zFArm5sps>$MTR&%rV6zUw5#C-b5^;){kM**1-ja$sa}rm;;Zvk=z%`t7<##FMTy8=zrntgoFqPX_Q*y9Vy)epfJT2A9t*tr+8l7KHhkN12N~FzC z`?mKgc}aJ%ADs(n=MU#<9Ky7ga$ z*;-Uko-_&oB&3Gwg+EZxSo`DTQsUOQrhu?JCDq_wMeIaXKe1$RdgTeWs9qh*&K`PcjGB0F6vSYawN ziOhMvjJGL!ktERbqqT^8 zrgLf-@#W7Rapa()oM`iCrk4nz$Qu!?NW*B%x+>;fo;2W&Q9LH3hqlY!$fgquxVW%x z__|P~{K_7>Ha#J$mZY&nqe?AX-4!-Kn75l#pK&@6coE~CLn>=#?xV0~52h{naFH$P zZwunGn|YvGQ@1uNTS==pyGpxtQaffZKD8!El*IyRFM!L7K;HkW`^{Q#-LCLxjlIV>5bubnBAy@VL$IZqH~?=S@8Ql|ylCKF5nk_!gU7 z9x~nV@mdVCaKD=!EYJ`PgHEak6oT$&>vz2*-Tm&T`)_K47S}}emqk1fPoRE#P_J?% zB@mB+yExLZ&#L-z!y5u!8#y9EJF+gk;u6DU@#bt!VSCg=dnxS>9KVDd{5`N?brw_==X+^V{)-FJ^60+Rx>B~|8rHF4y z-7hfAuMBy8`N0cUMT8l*)v8pA6EUHYgSic1doB*Q$u}L+>@zxdY<@e@U1f}yHtLg~GiG4-QJrR3|4%cEcjfqdZzM#k9jodZ-aC#RFAJwpDoGq>gl+q2vWMYkIv0MhVg5-M*eItp2?h3{& zmF%4_BkWQy9^-c=PNPZ-y>+c$Qg%Uhq{OWmO5n?g5e*J-488Xo%jOd09y$6L&eQp| zPX@n?(|m%Mule8-5>>0oK_xXiOXJn==&KlHE+$G~)J?hgrc64}q!yM&e(Uaz@Axp0<0(|yo zmh*rBvm_3eCmR{0)uOaugWf_%KX(__rk2aM+49TANqB!>QaQ)0=81uXd~S-PBDK&t zLWLT>GB+Jlc{U(;Wy+tA4lfw`i2?O$(Ql)B-)s zqDpwmZCny71lsG5KUTS`R-4%^JVjMtr&$QZ!+%%izeULTh;u6z9WIj|f#hZg7W@vj zOSdtQo3g5lZC0oHBcBtflsgg8&fF$ zb}snO((u9s(c0qxa7%Qw@MyL_f^Ey76;Z0tZIxi)4f6cz0+o#Gxt8Ee zM$D3GmmCn@!t`J4R-8$fmF4-L#65j#Lxi$-)fqX>&CNGfo=&~(f1f_z+!1^QN&bc` z2o;CJ*Y6r>82JeY;yk5A#?fcoQCS#56TXq5e2dMD!;E!R@D%PhL#3Z_4kji`PqLDL zzSHXN5cBo#B&m^F>1NNs+Wxt@!0XfI@j}f6I{(Z@+k@XUQx-!Iy$|4nw4Oc85xeE^ zz^Q;%aMIw~UO$EtKU0rcxl)_Xv(soMH8?pR$2$#ksy0)!rz%IdLI$7ojxd}r4%=*X z`-J4&@7GoLruA5r$ea$M79rp(ox<(G6w)T8-h{d&iS`3OB%`!+OpE(q<@*XHG<)=< z6M(+3z!Wm`8=00Puu2VJU2=|xK%_leP;(L{ulh5!;Xsxdu02qXuUg37n>DTkgEGas z;XIX&2z+O_OLxhkOg6Q0@a~sl0(>tk`!gwzQIZnco*O=XViOZqJO?uJz+-OJSVZA& zTCh{6B|A^!k2X`)kIeZ|pRy8t=c~AWytPqZdA4d!WZJ10GTZx!%hbotxWG3Xl;|P2 zct=tH=AxsN#hSlB?=a&~z2y>9oCH4lWE@SeGOtco-f&2DODO4Z=5`fgi4?_?mT*FI zT@?;7)*J-o$zN-n5z}wr7#_Yt9=zl76;LX;&=>^QA#Fagt z){^cYMz!>q?f%qymnctr#YMYcC~{^RrAFMF15adA37>H^iUor3Q|=PWb4m*}kmyr{ z23N-K`;g)I#=T!uAzJk+s8&T|gLigoYu@Fjz4^-)t+(1`p8}OyUF&8Kl`JhG8SL$2 zTPPu?Y2(O`L@cgz4(2YeTP%~;BL{077V;O=g7gt$i}IBCN{rh59FG}Nu@R~(cY+R* zmn*@=Ro>>hJ9w{FUjy6~p4JHyqTV(}=ftO7+6${JH2V-ASP0HdCCVIBu*^1E7T|UU zOObnjUHFg7OiJ2(AjN?i)ln${yVh4ylKb3&FXDiG7UK#qQ@2pzKfzwKhiVf#S5IYZ zlV7N+sYbpe=!e96JA%5mx0ssLfaR@3QhN2Hd!u%#Y;1QxXWWpZl3zf6>%-3H?;4Cv zYDD(+>N>(DpgatI;)C{L3p5EDayNmW^f&?cXx=098tFC(i$vK~fYpLE&-H@+(z#>v zp};nMMVe_#9NUV-CAYXW>H>PnoAFd!*|D%V{*e6{B*&?azbWEs0vWzNU-KM0w_wje z{;f2*@WYbowIWV8!U@{+D~F%EMLH>nze^%M%n=w*u=@}GbP!)b)s85F3t0}Ky~7oa zoC}1G0v3|L21BzXq9DKlZJ^}e)>r@iFBxT52UDlNE-4Ee+SvR}3F_64-c#uf9(t*Y zh8Dh{UO?K0BvAZQHey{4y3`CC4nA8vPU)N>b61ZU`>9>keaS1T?^WK0tv7-K=bY~q z?i)pvJ6lYn08*T@nVb9Rjyr+#*=W|+m&Z@v_?{Jl2q9EgyJW#J(b|e~(S@C`Dh6r8 zDVoX&3vvt#+dppUEY<)pD^vNd7Gmz=$AXo7Texj;LE*k`uncE@aQ<@6a!7^8! zW~NE_QnnfMT^_6Fp!)dN`JzPV*5dtWICUHJpdQO*kKyEWB3U|eTx*2`HnF?SXKgAN za}^I~H(x*+d9TL+ik^|zPt=(LA74sCw9rBdsF9saL+udn)r?QoSGl7oDD!S+H|hdlw0cNRwvZn#N3spE*JT5hTQ{ZM<&YcM z&7(ICYX-{t+hc`eK^&X2IeO~HM7{Kb?U_mGb=DX|JJ8pa6iLY~o7yiN`A2rY%O#>B zRnUh!jZh@Yd<`LF$4NZmB$K4QRALaeuYbf=QRkYNa18A0zBkXW96sI>Tr2Z9Es~9t z)-34RL>9j>yX1$8Pc%D;%?slW91SQepG_ilf!{N|XwKeJ<}t(KRl3L7zL)70)loWc zhKS@5ehTcJE~GSTmUO%oISirm$zo1l&kSpn3Y3J&&*p;%smoi=^VDuq9J$T)%t>2C zR>Z%_!$ z*9PIwHK_$Pi9YuqExbdM4AgDMk8~>Mv~%&T-?^f4;sP#CSdIAos$nY2tlBitm?SWF zxM`194Q0uiV^{Xw8G)<67i&kd8oZs`yV%aiV@meUyQhl?P1q&lNgm{N3FcjiM${JT zJbkC>Cw}6cmK5f@smI8vC^S{_&#$bMZc>_>FJD^c4VmvX(G33JHC8|GSCLu9?JPHf znvW2^r?90}f~EPaF_fJI4ubZ@!o%6ph~1@kB|G^SLV-bZz;l~AA~(e^|A9??q`_N% zO6Ix}Ingg^t&~Bnz8j~NUh*+LgKw3Rb$e^Mlkjrp!=Em`M4EY%R<9~AAgD8-`E(ld z;}bvr+Bh_YyP3*qLx;01#^xd^<(*t4{=}q`xyWRtM{*9^ z&e$evEKyO-Ff}-(nbY|lCrda2tW{0%2}e*;zc!#FEVG^oy=7{rQn|FSy0a>ig(3dS5Qbuyi$HfeB;rv8RVC^R)P`J8hy^>L+&18y0$P!V_?fF%%TZBp^)%z$`EbtQxlMkR)J1=A%8fVUvT1fwGF3_E&F7vUaz`IXDo5|sgKN!kRj7-~x*XAn=!BFoOrs}e-q z(TmB#pHHn#sdC5uel9BWbY^!23}1AFe`kdM)uQkJHNw9oZGqBHIS@glaFniUK?xt<#`?!i zh(p{GTq`)K_ALgXCyVbX*Ha7>>(&tis>GoT+YWu%%Lp>mQ$|$nMWlU^!D6_P*eXLC zjXiX&@)!p%93nHK+%P`s6#ZNA-5(!TF414ibBs*7;Klq>V^}%APFiFL8aX08`EK81 zd5Q(9K`dAIo#ex7ZH)i!*YZmbgefXkW>txUXzLOW`sEo{G07A@$1`i9un$>%QALYh zUr|t_E2SIUjvtn?=`gVAX6!##GVlmDLK%?<@OAX^XY@)GynFMB$htDG^8CjFHn|jO{~%ZKDv)5@MF@IetjWbm5tHE8`=B34vqg5SBnR&1)Zd)YS_=Akm1GnZ z1L_VsEc)%wo>44l-8?y97f1(eZ2z^^|Nm~0`J2}NnJ%Z|WN7CMJj=EPwtYpp9&l+Wc4;FMikY_H5tU)V7it<+88e!|?^I z3*?3%ZhlI>eJPFhw6sVT<{ym!V&~Y|8dYZ&fzz>={sM`}8>!-R7Z_=z-eyZhG zemaz@;s<4;t{DaBtlw7KO@(V%wQ3|_SJ_$fA|>ou3oYFQ z&TQ*9>PvxQLf=h<7<7?dTVVCbeAe9(LqN(6YpC%j>v1S7);8c2vSkW0FCFtC(k3p$ zcUL$Lrp%%xV+2S;UvDy%!Z+AtRjncqO$m;o66fl2tp>%=YPL9Y%AR8gL}>J8F`Y2n^ctBvrP6$Y=Zk zYIpEhlOPm0sr`hR%HUbJjTE?C>Bg{nH?GRw;crJkq*|BYvs#=`&`30l;Qbh8C(1## zwd6&>6$f6B-?$C6k;H@dLsivLC#$HOEG}BZ{ga+3UmadEPY_)u*~`K922!A4vgr|m zcdKWF?CyXCfjS=x3C(Mi6WBiW??pMQPmJLPz(I9b6@d?xz0U{f4=#wPoHHzgcMja< z9n-CRZI-n5o)3W8xQczgnlnTWv1IV;hz;qDhnQDC!N(BA$NrP2wO@GlhCyx1sX`S$ zOjA3V!>7k8EvndixZwKmNz?9no#3F=);>iz2R%(jaX{2>gkMB-SGQom%HqXzzNghs zy~Pwe;P>khaFo@*2K~Q!ul1inXZSnms=Due5pSb_`wws_Bl!#UVni#SbIAL=aORaj4N?KaxYNds&@4Hr)tY4B+vZv#*cgDUMO{@ zuWvH=24$`Ok#SNS>&PvY-$Xn-`sCw+KzuX@w44SXYVRpm;bjHfeNb1|rsuCUKZpwC zaJg&Gmq|?YgvR<$Rl`qsxx>K2QXv;v3FIKPv7rW+uX*M#Wmid(>*f5& z3sr~?8nv-k`hIrnMJF?oM5iEk(cS0 zUvikm;PpXeA_X4470M?!N9zGD?8bKx?RJ%vN`_qqRgXf2F4f1pQoOy(jwz&T_SKS= zjWQ?qA{p(Zf3~;v`ec=c;86~R?mU(lp0Gey>oy*!-X}WT4}cI`b=;sTb~?&@tIBti z9$qd|b7td~+;BXS-mflOSKRfJ_$WWeS8>PS_{n`%D!Fe>?m6>v=Hllug)iyZX9Ciq zrw*bkbmy$77^76?nux7nyjl;xk1C(wzPiZ*2z%21fgLI6 zd-N#~_GBb(1R(6_BrC2mHqBJg1R$XP<}vP&I88zfTvO&Z!us)?_S6KymruGm$6mdb zS9>Q>(_IXPH{YQki~zpy!pTRX=on7nNP4victF@=If1Z4)lbl5mftcjsl-${Pm5N3 zE|e+3>gT8sos2q4w^gYB(qkr1_*up%kb&^fwMgkVpESwG>ac?hCg=`{+UV z=O{69SFc&@ZKv33wKp8U6OFXY_D++elKl#_jEn6W;s8N;bf^2vPSWDqET7~wA# zE49Pw02!vIPK~|lW6J>iO+zqdi5ekqZhJlCd3tqEv|0&7Bd{na;rg#LpGVWB>3clb z_og5lorox#nbsWbbjQ^$P4m=Z^#tQ_8~U8>G&w}KmL69b#cHJ_?MIM1=sk_Z-Bgww zzu0MT%LU@9mRa-A-T#S;@Euc{;fF@IvF?cHg<%p82v7{TSLjAufSDhCOV|p<>=v<`cbJzu73$EGn+ zv=)fyaj-V;K<{?Cw})P%)H*{1SGk}gf$9QsZnFu8!LTJTNoX*qRxQ zsro%*VeRuqwee1Mv3{Q#=Cj9t%pP*pUh$*wT|^tMm`^8vYj}~w+5b$Vhte$&K3Q%E zrJPaBWNi?Pq*s%GM}sQ%H`p_)9G3+vND5`B2>Kc9L?$EBbZiwGzVuj$6Be!Z!R3gn zl*(nCb9#at3wR`+Q>!s^+dsK&dZpB2%Xi|W%r0r}1&@dh;9Ql0HyD?DWfnh?pCXSs zl?tL7dp&y(4z#IqM2nh@r+P?WbqZJmk@pj}WqHxur4}MjdC_kV^Kh#-i8|-_4o#|A zvlhXw4cIM>AP$wx_h$U|8PG9&aS4rzi4x7QI_`N5PNyTKeJUf}l{c~^)ls1eGrfWg z9>jZ*u8k(A=h4uhJ#L{!c~H*Tb4RAX*a5U0CVwP-k9Xw5 zk&%9Tun(@&>5cuorg-TpuZ#%x^bO(!$>HVM{i1RPocC~gE``;@rNb2%;ox&S4{{nX~U?_X20vW}qf@IoG!yY8U%ys}Ng&LE-DLHgZ~BS*a#$*e`u zbiE6TsD(HmN)6ih$M?i8x8zlIn#|~@C7%|FMUIo~Npxj4-8zO)pv!C*mauUk@fo&L zM=RSIB~A|h74KXh)l4(To>SL`>0tE1Dw259F0M;sWV13{Bb!QwJUBYV2ywmFt~6%Y z9it3XIV#_*r~3ejn`_mI_6a3zWs6tj_$cJ`lbL>`hWiSiXus+`#zxETzNw!RXX?_f zknltr!cdZ}oDQte_8iU)7#iZF_`+>L8)mz;`Si>Nh>(W6IpKc^kWQLbcP%7S$fJh( zxxr#Zc6w43o5vIKUE549##3m;wkRPf)|)fvflqzG!$LR_Z$TZ@IzcknwiUi|R3AF1 za*QaKuHBdTkUf+U31iky(9?U?O3r)$xE=BfGzrEWcL_1lQZI1x+BH78-A<$y^iI>t z_=ch*7k>=)KvdsLpMRgp1bcp`(eEo{B^hTiFbI-4B-`ACDY2PW%|#+%5a+`QqTKPM zc-9C$)r^l<1?XxKtjdO(Six3nfvPV271m!@-<>89k1nX~%U@&A-NnLVJ%P|$|6Az) z+h3~x9P>wizElIH-GA(=f!P;Rh-y>OU?Rt%2#EyChLTTTL%zwafYR7au(cM6`23%g zmp96tFi4+av+(;6AnP_Unx1l&#?0LMv@-!*2xxW@Usaax77D3_VZD3lx1&~)Std~s z;Pz#=4QcDNL_hJ9(%Iv#h@b~+3L*fe@gO*SU4J%k)^O!~mttO$W)G711UYmFhdvoQm=`{G9RjV=UbNiOF z`~be5ZE$27IHVRhIKz^Ricu{rVv$6h-9ytJ2_|!`O%I_H2Ih|6!m^CI80#>~ zII2E|aBD@EEiUs?_qFJ%X^f!@!BM0Z(fUI?r1j5H1}7n1$cFuvV3@0ubH34>8Rx%# z4&}>5apg6po4f(53h$0dwo|0XhKS_5S}A^KR}16tqgWkzQ`^iH`K2hI;Yo+GQ?~CzC6U&YOnHH42~6<$bs6N zh#SoTu=R2BW`&{BNzMsAnx$x_(U_u9v={06D0+fm6;o*g8fui-WnRQ^WQewJsZ^f6 zL*Ul=lEHS5_1UBgy7CpH+5Y0II(R;a#$W)>#NUg{KTCO2@C)dhE~-x%fh%~tzxi%6 zjxdt+4*ap2(3P=!o~IO`)gbBbyj#sqMpn!t;0I!mgkrB`=e_o2Yb4uzuthGmC5~JM zQ6%;&s>}H+h;`il?_-+93FDixY9nSfxOU{3M#0;=TM$j(^ZOF;L5 z3^OyC(RKoG70ik9K0KDJ&jBM-?m9JYQLIi_&&b8l6+$vMKP1zG7C+s zpqL-t9Shg{fs;!tqwefFGP*jKUhi2-lL%-vOF#u5D-J=|X3iK))J1kP68ea2_6jNN z7d5$b%u-WfYXNY9ZG!m@=E}}txGfN_6PKLaD5K8fiVi@OUdJuo1QWCrAz(waq;OnI zF;%DL)tr`T*J3_=NV+i>>Xz)8Wkg0R2I~Y6!8O(-FoI_QHpA@>>GVbAndsG{8CjeY zY8P9YQ^yKm0R1m;4~a~s$^jHDj#ME0a?bUqsi#Q4wLq4V+ru zm(ZaeR1y@ZxP^q^cchhQA>AxyytruD-?tUV6sbW@@=1%;Pshddl%swb_L} z)k`TZQsY#9Lz>Vg8>6sjpxX^(N@bQcocNTw1JyCVn5)S|6EvtoABUvbVC5#cIt9va$^%AMd}V8r{_A;6iF#|Ni;Hz1hSg)eNt%l z2+NsBq$%pwAlZH0kE3Tl){7N@P3~*Y)!3#5^4G&TaZKZl!# z`hg|VUh~y9NuBM%E}vA+=sZfoIgz#I|?gpj+&1`6V12ryUSb;nHhfu zn5>_e!U9#OkWL}QkHzqwL8I;j{KQg-PnqM#oG6XAp8!z*BP~rdvfIlW?eB#h>xWU3 z1?@icdI({ay=CzkJ_>mu543Pbtv4n}Oa4p%$J?7nPe`mxyQy(;7hN)wF4 z%;Op7X4kv0+irQrA|9V7RxCyi!dn+f2A^@rHWKSoY1@sG^bB%05&J|L;sQi7X=_-A z^El(uvI&}QSg$p<&BJ+-LX1-OLJSa48y$he`oK=zw%wQLgXMR{&Y4~LZwOh@Um}m$ zM}0YkLLt**umXw2g4vcL_p`xkIW>rcVXmGrgU?@KD$OP*marN0Nqfqw4VlzH{Hp~T zk#F(4Zn`pAF5-has(R+48{Y`t^`GFE2Bkfabd~>E(pmo%>F-VE@PD>{p-G_qPyJ>8 zkuDDZZ2zsc!Zb+PRX_iu$xK;$xw>1h{}AROrLn+NB|RpPh?5{SqgLNSVyy&8tWeRQ z58avSOzkB7UhdEU%N=)~oR_-_^*BAJ{tw9WbpD3fQ4I4ZES>ZSU_>*Z6@C;%j%evs zK2%~I)+wXST+sxe|8KWLvP$8+e(Od!Owa&O1D5r_H`KE7{S12!!I9xepnmyl&7c$7VoDZSqJI-yk7LMH<6d$M@+K&$apR>Yk9vl;|%Wqjhb{8jj z+`_L+BA*$z13lH&K4r(aIRC`2=(Q0ns>F zFcf@w&F3kQA1$erCsNY{g7LdJAZPjQ0M%@~0MoE7?dtrCc5`&Rj^-k;+!3^VXi=n= zv=;}KI~w4PH0inLDov+YJD%kQNzQ;XX}&6ww3g#0KK8NL&}Ak@4yr*brO$4GjI>K#psiyY~^&SZdrx7|FsTsbo(a!z1;a9MxE{7p)Q4t2L6xIo`I4Gs|<*G zU+lju?cISrCLyr2UrT9rKI6Pw2P*&GS>?uu#EbB%f&%-5)D9X}s)WJL%Ij*8B)0v$APQP0k`YicCsxYuAm}|Z3uyWd_5YCGut^FC;%74CWs!u zqNGF5VKY{9g{jftRLArFC#<&MHtxwT`0rC89mNFQVkuV*FdY6XK4Fmn*b~%VF${@Q5J{_SauAdIRUZlCq|u?5YS}Jc&9SeN43{bk$jSQSbgj9h;8yp(1)X#X};wUF1)VnP)K7uvb?EonmrYrt=!nRWApqFtESjbr)oG$iUkrFJ%l+msHBh=B-1GN+B6KETgkhXX5 zbci|z89(;GOsFj`59V=ZW#$qjKQCWu?3yR@BBk~zXNvoC$^iF!;X^AYpZ1+q>mw1! zM{S!w`#uZ$G@NlOZB(7_Vo{0F}e!l%eGY4qSOw}cz1`}#KRgcYXZ<~bEf z4%z0TKQ(5{wURZk#q>po1N{Q1wkryFZ!wqf-;ZEJb~XVC%#1L)BP#2ET1+gSsCU$X zEoKN`C4pC7kEb@bU$M_3#;_er2HRUCu*Jk8FVh9KnBONW4WX{ui)%~_!jW_v6Yy-1 z{yLxfM`iCEAQMvMx-3@xxlpGNZIHvRZ!#(kSlQS9RoNpNMKTcLz!w1ph7Tw(z{>tz zU~1kg`_&~tQC7Il@8e?U_gFW4N(EN-6TI?uKJToT{}t;mbXkzh}<;d>LZR<**WttesKOd zV9${^CAim(u2 z`CmYtQRqu(1WgQ zI8fPbxVDyK)kSerK5Y^5KErFITe~j#NL;21-YY<0Shr$%Du4?kQ~{|2swi~H!C`nH z6E3vC)P7*0?|TgomnpuEXR(RXy)Tlr5M}TO^^SMcwOCW#(!Pp+iG>J+rcM%Jh$g*; zWB@Gbsc14VNCj6=mOs1pcobqu7%T~$F^832`*uXrA~(pbP~7&#Pb6+*^+sSlI>y!B zSPzrfT!T4X68?q;&7G>!227+FYe4qY1JoOryUBJbHyp3bQ8Rs+E|+Ta#-|eFWCBmD zABP(V7L4y)%*Uhs-OHTRj-c{cP3{SBa@N zmIzS*=+%?Hvl@M*tl@}F^F!Z5L93E8?wSpTr(GyY3V@C2uw07o6JC{F$K;(ThF?G6aHcxdFI7C>L~w#`uDaB+y4dBIsX~;_i0+d zTL-9CeoA1S3W}i(Do_N(Rx#azxJPIi$c2dab++m)$#z_l!~ggy9fbV)jeq!p{DeUb zD?2*H#Qkjjy{Wf}{c{k@5ETSarTtPmdu{qd@dpd7YUxT1c|E<)uEkNndC8HSsGU^j zp^B2IA^Wce>bkpeN9$=>UM2xR!j%EmK2f*}*Vt*u7r`O7_o80n8BtDy2ZLmzTBe+P zIf=jr^yPDmI|NRX0K@Xs=NpnmpsUX((hr}p2LN4tZF@tBpukVC=Mwwf)!RS985Vw0 z{S6-ypH z1#=2z{Sg@DNB%P2Ev=qX&GOCM%lNY<;E`GsA9nNTh2m$65lQl%KLR8FM_|~20;8K1 z0!>Hya%)O%zs+WNi3W6aXU!DdI`|g-L>Ow8c1Q~G#5p;N(|Q6 z2ClTE-PbTOKR$ZpbHXDW>0F)r7QT9%H#*1 zZ)mU_B=QVcn($NPTFACQ)?weT9Yp?NeS41O@m0(uB2$N{)X% z`AMw__wx1y{M}&K9i3+1Zyo%5Sr_^*zRmjk6`Q}2Ua#TpqpXhiwmvf`Ye!E8)+gwA zR2A6(H+_j)2RhAGfJa0r`E3n@qVcD#x3rV;)xLoZ!>xfoJlo=L6Fa#gXJtj{JXjjz zZELCySLKVB3g5f0qAFgJ8HOF{c&ygALuiCX4HJ5Yf*TN`-7a0 zd)0W-j0uo0fG<-+?y&~(niu9`t;s9jnzEj`F zP!b&<$zU5KEPh>&V7N$Y{5(*nS)|GdnNg=zAZy}yDFNq2S>||21s8<2=6GoVCxXV8 zlh@9c)EGQq7x7X4X6uh5XXTe{)#sg89gKlW*!U?B!y2LVq6q_2;rP}|4OU}|tqzc9 zE-rK=87Rb!>t(`FCdxvRLw;SnWud(DGBy?6peB7SF08ueWs9UReR#_S3L>T5c9gbC z_c1QDO|Nm};K1$CM^5zHY(AJyo>)rf*b!{FR$SUjI-j|7*Y2nCl-X10Cbd1=5OGd6 z4(_>PvORL#t6k^%79TqKD~*U_#|O}gL`CJYVQ5y=_-E7V=;C-@3MD&iWfkGQWQGVG5yRxlY0r;!kI=Mb!g zR|lhe z_5irk+ug~0$r0?;#tP10#THXu4=gI~Kgccv329@56#Q4_O9J_l;mp%07BBn2^g(dd zIhw!0=ub=RBbTpXP495oM$ItfHaAMH;LM<_Yos>}V1mb9cOt^Y>?@ z#kaRzE*^ke&gXd3s|ljogpe0+G;d#7JGpUrYPZ&1!y6aSb}yZ1ZCKfZDZBG*sdXxl zHzLHA-*5L)7%Ml9WX6{l8`3sqz`+j3sl!X)d6nW?lw!qDb~hP&$S2^H8>|Sb37Vwb z)&|kRpiTLObAfBfNFPJ_f z@uOTABb$pni}cBhKFbWypGzZm#yV1?A$KND{k&jjY7xN1Jvxl9rW{N)u^DIV45#Is zr^(|UTsE~CtJXFt=A5U>`#h*+0+us$PkTG$0ooatwy_gM{7SkrabFtVxphYT zO0*;U9ETq(q^7T`U+fPaz@?#4>@N!Zqf_ip2K=K{?4JhXS{1Ih*8@;duL^qn&PzkF z2>PSiXFGzz;6PQ+66Ck;)R>ID3WLm9=r_wb)}2#R`-yKDGLzt(cQC8a8a%H*e->uJ zV@jEkS0tLH#8z5{iuI;S!BQen;9Zl-aZc=bTDSEb$u;`O>_jmGN3nYL-(wkT*(YP9 z;!P>caBh*NT7XE+4fJmiM3C*LU|}kB;wbw=XF5e`3$?~fK6ZoqlS}XUbPGZSm2G3FU03YoX zPioxx8mfZ+7dr&^gF0y?f5G9@lEcG8k>{`;EB2Zbt)Y!dr=p55t_Ty?y`i6#WE%>s zQ}D7bSG%^FB0HST2hmR5`xfMCC2`deASJ8CpC4B&oA75*AMii2igCxT1n=IvS!MzVd|W2MX1L5)4pvWJya6&CQ3Lx*td>upgx>eyg~*9 zf1MFmJ4c=_)N77PJW~Ar0jx~?p#+=f0ThZ`_L#{rE+kEM)ySwZL|axx_Lz~;!e~e& zBF~n5!v14$RW1S77@xqrjnJz&&PQ)#(IN#N84Nt|gn~9%kBG-0WX30YkdesfW3u`| zMK2h#HvY894MMs-FQU+H8*Z{i6$F#F%HrTxCER*v^8zCL)*%OEM|>`nB|b?Q6R5`B zRjAL-eo*N3Bvt9(61F61Na<315H6VFuJ~$xen!oT-xVi}%=Sq>{^_|ga6;+1GJf*I z(|g&W`~}a`nJeXNG;JZ8lf-_Uw3gU@ocK!D^Gb`UawILmL@$foJnrGNO_No}8{`am zsF={n|HDj8q`~+V1)ku|x#KLZIBos-ZaF*CFL^V}3KA}`Pp$B^i*72lcp80n;v_2} zs>cXTOBwqHtyLi>18Q!VJvN9COKXciPrL2h=x=ME9HLM9k=^(+%@8-i8xX~peDjz5 zhpK|kskpz*924r9BksU?gV|RJbBrMD$lewkn9Bc(QYr3oJ0?7Gdt^_ra#I4hy9fsF z$Q_3ov#YKJ@D?uGk^bT`=okN70^ntqBcmxo`6OX-mrT-5TD{E}1C5EHX`fK$27t*dW=Nx8k1R+m|E3~KQTozo)MW$lqr9)B#yanF)gwBYnEUspuY7Y!<59G+N6t2}3goYV;?nPdCnm4AlPQ z{p&V)k+hULX@1hxjmyP*hiFvH7RtvbY}Po9`3&6ttf6bRanl-ULaGq>{ipQ_1yeCX zt`J9PtrO%$Tk?jHw$qaF6r%Y~ok}vxx71|$7M((uDW~d9zAvExCP(TvDy(7OM&iFw zQA11E)I#r96cbaBOd${D3pkBOMy!1rQIxxeBZoF;RQ7;%)WIEz{_W2o40zb0IN^Q(R>Xdhft^tZ3Al4kDAoYJuHix4VjI#iDU=H3;MVpaM8cnsh zPZxU7XL0ARNQVx_9|$%d{CQUUd)J6)`teW@;`3k#jII%DdG5~7W1MjN+KJLbqNMIM zpn@C-NN|6*KaEu5+(~itTq#2De3W7Ei4B6(NHj*_quW9SahhdNVa}yaEYJe+n>SHn z-7cZr67)MP56x71lI^d8K>ZCROn_2+EO*dS>uf2-xC6G2ja#SEx*&5rzfbXTd6`?Q za{qW^YG!I`VV#~Z7X&>9V7L@&$SwYoe}v<=%wmQKKeaw?@r1FiNr$vLyWD6go?ld+ zu`e3I=BmIv>#S9TYxEsty{{zT`jwj;O(4qrpH`=G9ZDL#HJ815g?#f*7Ua_#aXp8eLS8 zU5|6j`?d>Z?faYVst{dW?48 zlrH18sox+I%ewn1rI`aCl_cqFn^UtrtaViLYiXP)s^LATWzB7OZjGQNFBFBbr;OrZ z8{_!7O(dNHYD7}4nnBaIk!cgf5A4RvKv)+nZXIT2IU{>0q$-B)G7fC3D>O2x_r%l; z_R^8$fkS(^8&@)MgQ%5^!@P1|v5y#-jzf9fT&%;g)!BKBReZa(NQ zhEn?bL$_$g>lrim7tL{SdvuGM@e87VPlQCZNP$fG7E8&^CrdBYX@uYihgD13w)({0 zG-$>QW#2bMxD|2TohX^aLpn&=++@i)o)(3r0!mSxY^4cry-Ee{E@e{8&xa1UxBt#V0lEbHmfwroi%GXfVzontM-@B z$v~A+-~RoB=OscuOO0NtSt+u8Cs)C~T4g5AbU4J>A{REEMH2GIIomN&kwAdBi4Q{5 z@Zxt{9-YrSN;a{`{SeqmIno1WE|MNH13UL1B-fJn#Pl6BThu)KL=Ice8{*iE3bd`3 zuV^@2C}u%!TJO;m~y}1Wx2BUt1a3mj11! z(Xve5df$@7eEE@z&tY?j#W&t6%-trPbUTzj!aeM!KCl}Y8hQd9QNPq{EwZ=*rp(iT zJAX}9oTe>9D2|bCQoMK^HptP796yem8J!=ivUvOi04icC=BS&F0 zt=0}`6qzkCy#n~9@52O+zLUfm{eP^z1CyrRwk+CZ+jf_2b(d}1wr#xSx68JT?lQV; z+qP|;THm=5H)5T;*Nz+e{DfydGsYO1b7W>*&_)@D$s2}$!nOOG@W9XIHP$deyN6t_ zM(q0rg#smbKR;o0lc7B~KhzIZ;tM*8>=1wDg4!-|^{vdE+q#fX=uF;U(PD92DYP?i zdP2S^KLa4r{2u;RTN_#qQoF9Nhv%QF7|21vi?qGIXt$9irg>vdNy_v(Y;#&TSA@6} zop0oRYgVYcg^pi>n+GE^gVA6`sC+HFAx@JnWh!jiNXfnGaLRUlKVxWVu4Da7a!9Wb zMVEP|z!%+%-j9*xG87wwwKA$JZbq9UwNy*=NDqb`q)6hMlTK=BAT!NB250!@$++Ii z=kq9E^8^PWKFR!^t)FZw))9~Zk-#pBudY&4D*)#X z)m1j}H#`5CLPmjwHr&SCa`d3$N}9sXu|esO_A6>IXq=6^Gi+!N(E1^^Y@DSbgSqn9 zZ!xv*Vw*we&x~i-TC&9h_KU?|eQ##PtF?(DK2)kAm5PDei!7K?qd$s8RcA_7E@?K7 zJ=9;>t0gjJZQFzZB%pE~L{GXGSI!8`_mA5%&|Nx{IXaImX0<_N&N!1rXBKZ+JZ*`<_{9Flte(b!yWHSD(+kD<>OE&NpQ`$Hk zKf9mFt_Z_IYf9NF%EnaV!WMXDerh5Rd*<2`u15!knu{ZMGa z>h3M&3i#by$_J#mtY*=RyxU|%J?2rWbf zsIguemoBSu0#__OE+%(05#}8c0|i-%t&6#~>mrkxvx><~ipWd~$)GvpjpC5*Fi6$8 z5}A{v@3ZMRHIkV}S(I*>&g~~1Ou~~L+p_K&XrunH@tYqUJLLdwm;N|x=yZ8H6Pgo{ zWnZ{?xa&E-{7}K~rCznd`ei&UY{@Mr54TPFQ?7X%bOKN;UvHhzId* zPQ1Eo^pN0J6$L2zdj{)BxC%uhLNB$Baw`Q zu7n4&dX;wE0of}9FqP>dX!>Cn4}3&G<9qT2==9#lUd{&nHaAfE5135W2xng^5sXIy zj{^z7rPP(aioTGKHubG-VQfrnD5oM2NGby)=-%Jc%M3dTy~=#CVoWHP9d|FN-!r%+ zqq--u!A1Kpd--HA@BYq(_*3?^qhYVQh*`095)49Dfe8-XNidJCbdT6tKxKwFu9K@A z?d{5gr!}11kxl#z%vh*e@5kC6Q(5!KJG_Up11$QEd>Di7J1FjBF6`lLJbXXW+%5HA zJ%L-eRg)1xze?H!nBHIaY+=KXDswzN zV4;)xztNkf-YC-Ti=Hdki1I7%@mBmpcY|vB?z7R>zPtJJQYij3W_%EaU|3lrH6x|IQq<}1XnOLM5JB3tlfpvd{m)|8?e*~A!lX~L= z_yOi$B}z0UE-J6pa)$Vb2bg(gy0miK%Y2d#>30d=>FNwCnXB0dTHZgl6e~n_0*A-(iSC{#V zH^RIs%E4zE+DoXOm=w|e0>UzDh$IAKltAge>g1=YH8QRRC`Dr=!r5BGJi#h;YiBf7Y(KepH~HC6A?na_h!9W; z7;r6tTns9RLIv0vEvnq#l8xg#Zp!fpjl_D*p1p9928si;b13-7(F(8y!TBt^P@T`? zH6IAq{B5gjl7__H!zPcJ?vt;XhaK7LKR-G?&;mrc)WLD&qeeLxwWbe>rdjn=@^yRM z7-6UNq6v601ZTg+wvS>bMb;3Sz{|ksK#Z?f0XL z^o!gYG3p`Hw5GaAGm-aUw{L5>%hTnBxFmg#u|#VbW}5RTs3u3X3NqCElb7DDkW&VT zkCV_>IK7yjx0`3eP>#asE{?XGr&1sgmi$`8&6sLeU#6WWtbXBW1WbPJpF$T%OKIndCU zUQKHLegK>@7Gu8wZxVmEj_|Ye|d^i=jZAc z^3EOhWWX_-$xJxFQbt+*Kt-xawv2;$%$jINk1rFFG%=A%2*ZH`!q|2M)x^^cFJOEv@4xzDiXyqs$4~?&Domb(QzVmBSZ<(sqv{FsMrewtwo$Bl&nL8K1fTP$Co$wM*hnrU@X4)huDN+^9LVEf@fx%y= zD(_|~mQD9Wj_msq)!YgoOcYg|O-tb<^RU1;ElMo-HRlNM6FnB4e=g}4%L1)B_lp|ISNrCjf2!JNtgL~A%0$thHR%L;r*M%y?&_IGROp>b5VPOiMYj?n@MwO`VB zuCMU}A2r%2PiwZ0F^SA2rm&ip#JgSd7;f6SwmK>WQOe>}Sm;Uu=?_Jr-xJ{m7ST^i z)ArzAqdO96Q3Ar9)g$r_b@MVwF0x%R{Kp;RJGd-ACu6hSjq<)EyCfFIs^DG6pbGGU zU&L5aqLjr*zm=w=B{?z%7{&rq2AmaT7d^=>0U3S)i-(<%?gr4=g4S8`Lq~{yxT0_H zZ)`b+H6q{OzFDL93H6|m)uoII>4~@tnZ?w%24o|=02H>`0(*cY66#wwNWrZ2V?<&o z!avz?J#g&uJwi)*Zdv#Io_v0GscyHxq+Rr4AND-3!Qc&e#KRL4C#T#QpA7ZJTc;W@ z5(z}myDV&QW7Ni)!&(x9EoIly8h~y6{k9$oww4U0HbY7AWPWuuso2vQ@XJ2}_XA_$ zre?Z(Qg|DyHpf4>_e~pr7t1k7zlZySfZ^uSF%3ye?zUU_lOVZ*uZMv85rHQVg>2QA zoh_MQm~O5(s4-Q{|eB`~5!(+gJR&P%R>|W1 z%@kJ|>klnHJ-TnVeaxgk2t>B@$10VB{*7)wl;2BE)At^+ww~&pIZg4s-=fthafk7y z>m_$7;5qJJw8JMiov)g89zOBeth%FH&t2)H(3{CGewTVImq z|81)7f6-|FZ9b_|*LFwyN;#5qPP1gGZwM8d*6Ipssh6dO2we~=Gl;Sjgbl?Mk&Dku z<4FrilcdNcj`VnjI{Nbv3Z)}Wom2#uqcgg>Rngha>6kOj) d_%(edglC)ZGU-t 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

    g*n^1W!t!S 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

    q_>j+}_G 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�?tR$d8bN7gLlLBen8If+0?-^w$D7 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 @{eNK``d(0$^WNX`OAuD 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≠?ZfBR%|vW)(<;4ATt{zQG@Wi|yTEQy1N)}xAK&yoX>)QcUez?*>1 z-D)8gkFO*D<_&_H?(PLix;Th1*R)Y-gC(38=+O;b{5ETZkz?x3t;;AU4!T#ybe~81 z0AI)0wlxa$_Vw=b2he2~zhT0)+{)D(b6;2Y&hp0g9;7Iodk=0_;G_{4@faoU7nKRi zJ+BW?T-_3Stx+Watpv&F)6wmVhL0yAhIA<1b!wN;`Te88&G=`IL}Zf_ABZJd%=9ia za2VrvdO|u!jIEOndw}isS+}pXk=6(E3*D;^f%!N-ZWC7vtxB> zewL2e%mx4YBUF0El*`mk5FMXfJMvcUIqAzwdas;Z1?iW@bL;YpxuldMPN`)M<*5a@ z2^9)1%0mO@yTg98bjkQg^kh4iU zyQ4REQ2Dcp8?@kZ^RDJxXA%oywX4Gi*M(rCh_fAbt=ZS1@}%y@z$it%x_T)e!f{mzLTtmhQ3Et1k78-ao$!@)~#5@!;RF&FKHB?fEYl694ah7yfNJ z)1-Q-ge`*cWeuT?Bq%`9go>(V6g1#4!`=v}_>~u>*yAtnWpZ5~YfbNYdu2G;z32Kd z0M1>Ye;G-iSS|e^SpZe@qE$nHr?I*`BNX5C7FJO#S!e*?^@%R@sm&gBt5yDf+yJNn<4%mDGTkn@4nPp z6B4^9X4>iQD%^Hq%#12!q3!ZHFsCMYzzW)BDxm!@9Y}tFMPLJ!h{1FXl&;HBNdg^{ zp92OK&04UA*V^*zJ0V&yXy{R!#vIAz?MGR5Q>lc>d7pXD+%71 z(A!)R%C1K;sd{bu!03RGA)2x9(Ikfg_tYTL>5t~*GIE;x%6EAl(LrR?tGK$oIA4qK zlp^cDY}*@7S@{~~lKMW4CXm5lY{p1Dg0np+0=0dew1^C)rZE{vN*pYc3xm-do0&42 zwU8u^=|8cmI-!X8W$}(S@An7kl+S33;rIh1QDnh@1_VU^fXM#gXM{=ZAuNhiL{V$kfTHMB(k=%skx=Vb zGxvg{S6B;FO?qn1>H1=>v4=+=@yiW-3L}%$nOC1fz_y!@?BwrK7>9FvN|-~ssblCY zNMZdS{nd@>P~Kt<7_$>k|7wTOOCr2Cu+bId4#7qxXB(JZ6#^VURb=+^jYpv)tPbI_ z{1qkF(i`{N-v)la1K404lI&Qz_Z8y<*N1`60fG-~(cq^jn7FvznGtL^W+sP#0~WPA zO2zXw9Vd2W7er{o-}v%L8)`|yKW&4`AwV?e%kL5qCr!TXb-B!4S#Qu;xa+I9mB%L^ ze3|k;+W2FOx8eBSWE1w*^ZJN7gO{EmVN-unI@qN;#p7cTi0EDQoMF?M2-$lU(5?EV zoNz~hdff8;9bt|7{LyJfNqyWNk5ROE@k(MJZIHRNKk!YLUeAd9nJK#7?gX{OI_{s@ z9ui0Kf_wQ_WQ>5wN4Ly(KU4|*pB^}^|92ORl9PcG!06w*p?`ng)Gb|+MKFBGS|s|= zEJO|zQ7vN|QJY2R1TCyjMFId3g(y&=Hf-}Qr>5*SY)Ky7J7By%im!X@zx{kA;{rma zKPh6aFN#x0Xl2d;4pUQ86Q1rzos${w_t$#AK~9FA83P$9@P+JQ_MM|ahq3K11T^`k z>^d;TeiE-Ugx7IQ?NwQu_i;v7ey<9da@5{Qjoe3~8@30t9kxTg9+-`EEm%P(?=>rQ ziXtA)V;26_xoI|Ety#m(o`}{&~(b;)LgsaFbHL(r@JNJOXy8+?fNAL23StVs+jg&*l`4_{h>ZqJLU*LWaX#0YJB3FjWy^z}QQ# zj!>kWU0fWz>E|+AbqZW;tEx+c*Cv;r#oMd|U9Uo|V>3>I=G6jiVQ)e-lB71htS^W# z5IUNSHsK8+)dia_km-fK;}fSy9fIk9r3I?a#SQlFm!~{SkzqYbGK#i@l1Aa60b>it zxu&#}S7iu!#^l0&kRPIGgQ^}E!dY!q;yl9C-PFDyug4=j+}axt8v>21dss!BWC}M? zx>xYZ-4XH{xUKV-yWt#0hw2)D1+>?oT=e?{UoPgUn&l1$gMROm>HL}=c7C!ZDZuP& z2WS~*WQ{&aTSLef;%RBrbdnJ^t%)dkyX~E8tS{3oiY<0uq@W@9Hz(9Jy&Lvgm#2YS zmFIyxs^h6qsLl(Gz}ZFy(6Q9d=g!Eq2i*Di&hZwJVOJ|KfrwxGS={*_oiX<*gm{%i zz9_|S7$>S0QVh2!&rK!LZi3J2l(;$zgo&WJzsh13Q-c^cHtW_*X_+mG)Eme}cU)4N z?HQ*tju+zacD3P{oY+Rz5g4y4)twmb&t7ke7~>}hnrxioD>^>`IL4J=)zYaL0G83| zgxlPR0b~vS`(*u}(81iq2~#t$u4yCF-2COXi>xeB8;((UcCd+Ik9KjmvNnSKoB}%7 zs{|~J$#^7URzHjAg}8{?blE$bu}$V%WsCG0k{!H;?aYNBhwPj!KYC-$LFM(>KUUU3 zf;%CeF5^;=J|?Wr1+aBJp6 zhi-~x8UU?d2|?~4re7Ix7uXNu>$jvF*rs^-;Uhx62L|}%sGUgUk8@kLh5>)l z?d`MtJn%51ozvri{PVsU4*Kdcv7ZOgR~8-#xfiQ!4L`$!=^jc>765HNDjUq@1FqGR zusV8!doi)quhhilqmx%)Eg^=jcmiY@y{Gb^>QtI7OF(17H&trTaTFGoKh0fk%;y(N z?zRmQNUr4qcD;N0X9d?oykQ6TVrold=P6!qA4z71EM45H*08}R^Jxf(M{1ukJYMzS z7Up0ZyvnV*2DL_BIV*BtMtZ4L{2VjVFnI{6%TMY&XAg=mV&L;%@|Xn+Bg)T7ZYpALIem`6^F&U5Qk8J&3K4fnvM7$)~!OEisn*nkYFH(R(U}^U!7^4 z%k`?7AvfM$e_5_mpSxq8f7?FI%Xz;L|7f1s)ScMx*In3cg!jCGhx%0L73-iFCf>U( z1;#dJKQkZ8t{C3Cde7%Tz?bTc5`FUyx#7DbSoe+LpPnxK80EW(8kF}K^RMNQ z<(*|HpZ)%?-LJt3Th#Zd5d1wczQCJA_>ddVpj`Pdc-taHT>%rQB+pqHR9&aoJrQnq zsdj3n*Fjry+cAo;hk=UV^+&zu#55VG8c-S1;uL0)_dzPweTZC`k8xc zZGsGk8m)yVcM@&nMEiUBR-KA<7tDwNgl>O4+da79pIaUoqtbh;{j!_4vIDFyJ9R?f zVJ^A>iM6IYSq(NawG)5U`>|ZX1HYqTBFj!g`HC_GbxqA8Rd5!hna`q&Div!Uqo2;1 z3u|0&nLNV@QLw@&8k6O{e?*B z$ME9XvX|Q!EbGx*em>p&9TPC>TextGOqno7Whu0uKgClb%wjYH}*o3D%lsSW;>T zVqD#tW$z{*htZG8;Qmh3-gCC%BXJB|mc-^sX7Bj|4fxy#dz)gOT2_ZzWK0AZ6rwhI zS;*;%9A~a)w-7Z&S_`G;)}pCOFEeMA?%xt}TNQ+%LDNH&x57eu`zq`OcwRGElAzgk zrOH0BSmu34qwN_t&suSYE7L=9sa!lR-`QZ!_QTaJ!e-nl>wdH~jNgArYLGoU{-SKm z-Z_o3FephLk7Lsb0zk~?v&bYt^3a~X!>uv)XCf%1_>()K2EpxS8}4Xiv+3!fWYLC% zbe!oTE(syZz~F3iY0}K2X-z>Smx9ph(O4Z4#=E%$;7ZqfW5|vpu|OT5P5*) z%%~By^VdIgOFo0tf@Vj5^F@ss7Q_)*Psw)gUvR zM9m(bGo&4)H08M`D(x=SGJ&2|`x38f%GAC;uH_L^=UNuZUXmZ6^_9XFW<1D})CEN- z|5LzNwkVuF7< zIk|RxIid$qpKx6Bim*1sf-_CwpHX`q7s6S(lT$`i`k^P~>28Di z&!MJRx-Fe*MG)(~A{6io^XAz+(CWs5vj+1F1yW!D=nk+>-Pl_3Wmx0YDIbngfdUV>Sc&PLP5z1$|vO(?2XT{!BI#RrWzDD|5e}u*cqmgHI z+|z@248EL*)|A_$tJO+V2+x9l^{|0b~rR9TY)M``z) zX)7E^qs51nFJXu)Ofbz38mJ9a)fHSxgiN}rC>_OM@(#DVf8~%^f|ukO=CEw#?OmmY z44Hy%nraoQ>^m*R0P#GZBArvT$A+t55f{P)IzGS)vQY-4iYjmT_gm%kS-1gtBuEwz zRl%TH-O5Ym&^%7)0hjMsZdrmiWMO081=#_bdJ=sM-0T|(juYf*wOHsnj`MFmYR{M3O)d~1R67f0vynBjqnIz!&KSrO|sNb2sU(vs!Y0JG?W{US*)5 ziC|*Z2|eK4Dgc27LFyx+?<^y;o>|8m?EFi$FA(dfa=whI&pV8WwUt2WwQF5Bz0FIq zK}b6c{149YrDJg9s-?QM%}4$W?!>6GJ@Ww$Qu6`AWK0ns5E0$4p{US_KOd`Nf8T34 z=~C2}Xm3MLoWZCXBKM<19>u*$k-Xm8HeWWZn7an93Ti)}Gvd;$QXDqf$>V6gZ}PkK zFV$vQ&@0`{l%ip$zEub{I@ow>%*nHGK=OOl(2_qV!tiD)AMQM@D$$=Qk<;{;(|yFH zm_Puc#4qv83E!o*6BD)D>RI$suzP`&zUgq%o;RXe^Jrbf@9?X!PhB zj;9AZ+m*7BE2<&at{|r**X@J>jl@eSKO+glDY)q{Vm+S2*;W6Rk075H?r~f_zwMN1 z_gRYiEN;VPb=v123T}{zVVw%Nj$^iJjAr4UtZf*BG)iNnTkp6i>xSoTUH)XbZEmoe zvn6RmPCWUX&4xGF;jW(!*VQY`3A}Q0Upw+zzrjQ9^>3>wkrP+A$7Fnvr^+MaO~ms& z$3BTthC2W>ooG{Sa$2>Yq!*gyK8_Hy>bppEdd7=|2%f(j1=t7{=uLUiY1@q{D>S7S zD!?6ov!J&`g&ItQPP%=keRF>BS({2jebrPwIhT)FHlp707#+Z;cS*`dg=i8hP2uL&f4 zG7R=Cnyd7&$x<0ksE8(4!#!?^F1wB|_K7|hW_Q#g$`s^KC~zYA-AtSn|6b|5v}oz^<>eJKx@OwJ={Fqr4F}ha`$jlDK_Gp7Ue^HKy$Me+`3c_FX( zlP&=*ac%d;pigMOgnE5?ovqo$1tzz{Y=S@4T_I){S6CNTO>8ha@9<6jF@`RJN0C(N zdKAD`A5QHj7JpzCC6VQE4F!0a-Q24nX-wpl{qCyr`-e&h|@y)0#4C`!5T(^inH6gu86 z?{Vkcy6DXhaD}!D-q3D?$I4;W7p+YFbV}Apan{6Eix=+V$7i?hb8q;&NOi|?5DxW* z2v?Le&}#Sv?cY$HVZyPYH}E@Wzhv~b(AB^!{@!<;c)a*+^QS5gX<{~rt=7ftI!xtw za+Zs^CrG^*qgD?Kz4NKOaWD_N3+J~xRxR(Dj_T*$c2dxD&%Qt=res587OE3}b&J8R zR7b_+M`t7$Z<7~~$wC~?IlkoC`N}IB9um!{3=LK@sWRsilb^nfMUaCay;rZ3kRW&Z z<=`99y4qoK^uWM5a1UHYZNNEl_g%_tL_2ue+2WSOacyYl)uX>-+fS`xs$pcZX}~_vMlYD;OP3p;@#`+Z z1UAQYA@3V}q8Vjn`SI0->j3haub+5Cyjp@MS|G4ANYunNLe!&SvV;PTvhd9MN!51bB>i7wAJt4hpdb#vtdnKQ0w zmRfrQ2pH~(T;zU1o1OQbuN2<2GV8W$%4tvNyP>10M6_93RCuYGUm+Jurt%vQi5cbA zg_BCfXkR5=SNM$T05W&1*|IrlnH;J)`<8hSF=!g_wz_g5b}FU!P@nbpjw&_G!-#%< ziTn`PtLehCQ4YC&SxASyuBO4o- zBV}&<~u!)t4nSqnZzulEf4ZwGX1d5Ms#uMA9zErP;y+{CBc_D$NlB5(MPkk(2 zowk%?QhMFb7>PW=a1hLX5EWIS2TUz7tNqvE?C|s_@R$GZUUI{b@} z4M(#p_i2~uwqx1fANSwcYc&1vcr-n1(U*8M190?bbqT~LA`tMQ6PjK=6Nvq3edA$JoZF=$8{p?hI+^cq+;9iOc~gbV2ow3 z=rCtsN}i)VGqkQ5hL6dw7M)tSGOd+h5w_6_%9Z~yG~k>g#!gS=hSxdDP2OREGz}=G zF7G99K5MsV6gdzUBz*~wvJl3NmC@W-EvhK)wp~$viw|eISkAu<#ZqxrVrxphx+eb7 z{cXrG+sZ3LEE0<*QOSwA#14RB&}Pp~&oI#mE0r|oklndILvy`M3NijIyafK9?524H zX93b~MFy)mo7I+ICLaYn3EZJK@#nB~j8Qn*WzcxgMaotOt2UpkFBq*wp6o|+@krD@ zw3iWwU)bNDGD7p<;^k(UIeDEF4j2|>;3+(3pfCE2pc7M*Vi9{2t0xR5I7bu~97GXe zoj}j%)JO9LsU#!xg)%!NGNPX#aAR74lphCf{#0V(Y!n%s*~X=7bl8b<#TKE7bPiKiAr&1L-A6>V0E_0~iOp7qJ{rE^Z28Ci;?({!U3Kpsu42 z`c26`36B6tt5KA!%oq@G!%ZtwE{iix$fP>BZL4Z5?~R5k-7X)6qDh;;m_#A+L8RhCPv@cS8f8 z?fv&jhQ*Nhdd+Zhq+Wpapx}R#?y|r!gGMwPcvpEy<3|t0J8|2Um=m5`M%xDFn_;q{ zo|g9@yoI>(2;E;e9diuNsD69J?X#oz-y^Vw!P+ZPX}56DF`wQi6%d~D?bKyRykKEr zaZ*l$S0rRlOSCGHa1uoVwscdfWU{UpZe@ZI#kk8%2P1ZWHG{CK4OnT)U|Rm+Q?yis zzz1Pp5T;=gUdV5cq`n`hm}>6ov{-?O{Nth_1R^BVMGNXKEd?3`WpGa1PZ#_clst@J z4I~pCi%40X-@uJwacN^|W=`A4j@3`9rR5k9TD~_Qio8+h=~!_{rbsD>iGj5c3S(^5 z&V$8PIVy!YeoKk_H>+N_%b^*&UmgfnzxuBk)vn{gPX|8ulHpwFg1oUlj4?j@4Ts1X z;{?gg#1*wDjRenfp|#_ico%BuGjz_bEc-u&i%nS)n+y3%&!~FvkmM;!hvgXL<9z`Z zZurBldzw5rEzt?@{4^^%N>g!Cma^W>JJQ_;BXZ^Iau`0-#U4w!C}H$+31$fu=VvbH z6SRCC4zvPbngz65iC0bUzAh*=O6QTGsQDYkrTVuvbVfG^9YcNVxWRvUG&3GuM=&P%!Hy<2CmW`ud&aE12it43Dtg44<()hkm2S{yv_SivBzOyjh zI*p>%jteL5sQ#sG!NcpdexP23w&O;d9kD~dDpv7-)eUKDY(G%MIp#x0%npzvt>V#fMy!ixz&rZpg0~LoXB%)jH%Gv zaY%B_SD7k^*K(-BaYr?Gm_;SNB^loW1thkGZ&%8ucgTkMc;4VDn^hc z`l>Pk`P43+buOwPA(G!x*_@fI%(&1l%BTjTrobESP6t|}??YTe+F67CBWYQFUTeH& z=chkrZ`A%@dID%)=9@j5!4IBOA3vv#P})|j)yDZHN|OYCvdRW41)6h7nsUr@NI7|0 zbJ7aXCLrrZRL~~GOA-_4(X$@18^}+2n%{{WpDWTBY>PovODj>_0G>dqwItHkf}&(6 zZ3uk(W#TZ;u}$@;4|Sn^O_+kXAz7RrG%R!k=k9SCzQ^1YA4~Hf*?s2LK(q0|-;X?Q zQ8#_Dw{(;I1l%$69KP_kj1rt+usL&Y9Jg73vJdEgOg~cOdqkhggv5gF#VQohI*q5PWwEkDmjBy$ zt@`G}Z*}=*S=Fp^28hXdbA5393e4VGl_8+F7T>|)N0~}nO>4XV<9cOzmHGZU{TFz~`rgcNX++go6s;Z3tD z9k=ILKd(REFMkdHBDh7|d-GYhJKG;VveqGhm<}ON(o=y+57|F|yJ`maghTzCWIgvIGXQLu%ef zCM`t;WG-#kzpyNfBB4AneO}!E-g2_0MVtEZA+FTlaR8eOE0n=4M$N`%oCiNa=vCXg z;)mH2so_Q_A(OM4jj8rhaM3NtBm`GZ9%QhAnz?3r3Xi=+)`PHOdcN#aqsr7Oo}_Tm zOK2fwra^jz25IMg6L7TCovw(AqBl%QI0TBeV~!;@;jN+)R9P3L+C$K4uQLkqoa+Ty=j?LlT%@S`DSrf| zR5QvAmXOd?8z8w3|1K#bYq*}njFO2u$E5WsF%Cv*rGey1ruh&+lgjLb75);#>qRJu zcup7~5B%Wv7~Rp(VJ$1PPa5PXO6{>#vTFDV04=v(#enfsVZ`DTV`3~388vWCH2Src zGxs=NTOn=4#Bx+_!U3B~FE3$Q%n>^$N`X?QTyU>+`qTKNVgd+bsxml>Y7FtBMg{Ul z()fj+y%Jz^;{1GiN{E$|AYrDahF%1&#^;l^2*7I02+;H_xOJ-1cevG>HvJKlNHSR2T; zL}pW}r$<)r$spPq;s)MAy~W!yD~%YPZ5CQH5Nn2Bna ztxJLGNiWp&>5!|)yc_`L)yvR4#7D6s<$+n%M@zH=-2aqxY!0Ny_@EkZ2j(@2pxu-y z^%OdUOto6TSW=9Sm6Ke+(|PHHy6`o)<=Hk==q)p-YrwPmw59%`Ts4AsRk=!qFK(`V zo(3+Vv(-w)*o*%MOmORBi()85c&oV{_W_PH;_o9tf>ChS>Ekiw$C%_cftKT_S)uYb z&dCGRUmP$L8(Z;uo}w$UJ%{RICmV$&_#)}{8$HCy^p{%^N8W%^#|q4`n#SPsR_vf} zbiWaaHxEW0h%JqnMB2v`4=!@gFJt8#DU$P3Jr z;>p_|gI-aF#{Bl~v~86inlFPD&svXLQ#BI#fP!nPR&31|XX$O#gzF-SdT~NLWNE2K6=FP;W#yFd-XHLlv#oh%zdz(XbJ%Sqj@;m=o5vlta0cb%S$GK-^G4Sop$7w(`wiAhvgm zq$a!nseJQ!v39?|D_<|hf4!{mugdptCGT5SkOcWhR&c>ae%@@QMp_66AcqgfVD;Y_ zB01VCGb@I{<>F&^+f9e&=O6a?oJ+~9;6;>3L{Xxa1R^mrWrNTtk0H_$#ok$d~ zLH*LFDf~4aS=OAb!Fw;XNjGJvfIOn2yeXbBBt7|69Q`bdF`<^v0(YVaC?=yrJ*`cS zYRZ`f2BT+HWi2a4IMk9`xb$Q{hx z=iN}Pu^9ud=pqpT=!0 zxPSfVT0XUr(63)VowAkhiD}$waCdbECjYW(*?g4{@zHy@Jw3i&V(-c5W$@&D`ip$P z$>6W>bItFE5ymu!Gz0%?b1}o@GuIol*L3|7;e-JmblNL~fVwb{Q09cAvG4Q_U>EtH zlkeX@FbMt@4R(P4)5%N!pNa+&W;V7CCZe_uf&d$1fX(;#%ESR+3iw|(_f{$W_tcpL zGW(3w2VKpp6u|@@eW0XL3IYKsVN#(uU-6rx@mQ<678Sf$ zij}#kDU<1`%+=S={c%L!b@d7Zq;WJ=3krj_Xh#m)T|r!Q`_VoVXf=pMa6zb#P=;A6 zXUM}U663x`YLae@0ltdmY<$e|%nVT7g~!B^$Gp1AHzHzb7mcuIf7ITsxcEiY0~1W_ zX=b&0mv`^UPXd@{T*MN@VVb5A5h7f@k(t{<>EOSza%AD$VIGD!f={ZyL2Qwz1abo4 z13f1hCt@3Zg*E;N)p$;ran}vKj5BI@jAp=&$$&gB0U}<|B?UpX6FZ=xi7xTBoPIl5 zO%;r)O}@?=N#H$>n)nGwr;IiU(N`XY-70bNj(-Np zT!7^A!3)Q-JGI>)s(x0tbwqH75)u<*J9U@b{5cbhED$v|HpcUrVJ zQ7fo!-d-RWfo`Q6g-J9%A^({)VXFxxxM}_zB`Ugh2{NOWxP_;`r-f*e!J5OK8^pB6 zks$UFE&|dZDr*3DFO(TYC|lqiT94T*#u>ZrbH{{3zj%gkOL!`IgxY1P@s>jPI^kp&XhS6gklj3 zW3v!7LZxQUrLGbpj)G!E=ja;8;Ewe$9JlSg3e;sHwjSw5;21L#HBQ|Ljhhqv3CW-L z0sa@^=a>{{FBb16_lJPm4g>#S+-x9B0{N>4d+vpwEEjq3SU|NS_XUKu1ygedmILy( zoHc6(eVa-AxZ|tF!E+DjS%s;Pt7JB!`QekEj6&{nO>v1{_c|H^MJ;Mv6%oxAbg6!p zcf_>H6L#e?M8-;=3mTsg!r6*I+91_-WnI$De?K!uucw-S7CT7)$9LiX7=Vzmb+9x4 zpE{zcfwPs9jER%Et+BMNk-iT1y)HMgGS$d%BE4>#bsBT_aM1~r zo(n^eHPQJN@0fjm!D%*q_3@U2-VMSL6GZZ~?*+`;8rvtL&1ARQ^Csc6+u`Fq6Gh$L zS+0jqhS)C;wS1!hRbr>}%qL42fc-NVHWGt^;o=@0%TU?PM2*eslp@#>S@J~{(2HJ_ ztEf>+b^cpZb0yto5yLQ4FG2F}GA5mAONEz9Frlg)m4B(UIH?WTW4v97`)F|*2(oP2 zI`c-7$3|x4E9)sH25|$iqDtVnK3WozP47`QIZv=q!5$&J)o;ZY){=ZiuaLs_;cPZ5 zjby%lD{L7J+m(E}#A%^o(!QovMOjCl)7B_Wvif9qR5w%9^h|@+KF14pgB|32j>*mP z8`uqF4yMKb#@jn~SKhVTzNy%%*fwYEif!ArZQHh;itS{^wpmFkwkk>GYC(>P+ zN%#S5 z!-9AKCPO3CHmpC*rjy52R_M0cDjj^H6u`B`MvJR@(sNYhURqUG5!~-}k(=#93KHVd zvgsY?Qv0Q}iX*l1n{J&0x^l+*W%#LTaX1N4kVu}IC6D}z3i;XX(bTez8~vCRW=z&! z$sfQiTQAEk$gh0w&&97ei>Cgs%LP)!vP$hP>!}}+`)6^?2r1YMHUj$8Kf3C};Z-Vh zu82;sxSKjH5bb`>0ZK~Lb*2-MfAQP$?pQ#J%0M=Lzq~Edy3OLnw@QxxyQR{*>0U%l zgTEddL^l6MGn|QlvLPi}@au3VrH1ATsxHIr7`!8UrMt~F&X8_X52+0_-!hc=%9{-6 zD#x0fvJW&H-BUAc^G&)^vXpm}7v|W0N+AAv=iJ`F5?@P<{I`K};U~IP5icbTMEMR; z7rCXhzu|`Ai=TL&cK9wmrHvk@o~9bs-DZ7{px5H`EYtf44A9|HR!15r6cV%1dS=y7 zU2DH(oFI(7P1XIm7Nb%hdr zrL`z(h(JqmN@KIQ-5|RjU|tkBD)|E4Y}W5k^~m60{s{gtTM9x6V<+(Y7@OavZn2g} z>_ZQ)>=^|owmA4J|J??kHu)JAr*E+o*!H^zGZ*AsIHokwfYLGL7*TwIGmI7aiIt{! zS2D-W=AO3hoMU|FdAbk|?^@pGkChIBx z&bl>OALNVw;u$-|JRCWNjXHGzKe{Rd}02A@o#eJGba4> zMfJ(hGkF4$tXz-q9n#+;jxh(eWK=YxjwE&qP}7_{v6R1^&G4=j zc_K(^7GbuEf95bsUg28xh5l9I{$YkX79Mvx3ew^T@Irj~H~vpVV3KL|D~h3p@J|x# z|G-fz`PCWsKRRmFY`?-7XnquuP19y?LbVE73c~@C(IWK`tPQOtg29$i6yR_^>o#F# zzs=aqn<~o%`WgRXL(HHg7XK@V@i;?~LQ&gNGJTxm**EKZ#lpgIzq;G^39|=FAcj21 zhM&LR8Agqee~tx2P^A+|6ylEJ>{X}*QkmTzF^#waG!)dNanjhfOt5Cqqe_p2D5?!Z ziG7sEXxy=5a=v=K*UXy6v*D9z-xJpxdsMHMbF6k6WM&;x9eWJnq&?uzJ;!@YOg9fx z)ml1p(O8Ghb-cGtslfSo8ZgNW;8%Ki9SZ$*t5JNusmpPNb<= zM5QonX6dr(R22B!#Fi@^S)0P4%~EjG-J)U1Z%otV6DF6-;Fj3bQ3#e^^yvvfj%)R|Y1&#XQ`hpM%`G^R`T$($`EUTUjf_fyY#Mv5I*S)b z*Im)ZOUt9_;m^pe!`}kX$^6ONVYXuM_aDQ8G;FzP*0()R;Zc!SmK%*cZ;wu^Zlruy9Q9v)1*<-rwOU6jd6DoAT=+vXXG-DJ99agot#X750^_j}ZzYrVMmb!#O&^-N_c@svsOQY_%Ei@w3%hstyUORO1FC_yz~ckeejQ$MFHraX_b!F z$?7a}J%WC;gBUw*8z=`alr=iL7)ErhC3yzF_flkjrOpR#~ppX~cgO@)XLV$=N)Q^!*ozGXk?HKIS_c zrsV~x&KWZGVnk48R@Vb4&JY|t)Q{;1tFvzpb4H!<-gUN%1FE(0j_c2Cp=A8T(S{@* z4Tp!^;}yM`>Cm z{Gd!20H@{_s~xWwL>#$cxKzZ`BpXEW8Z~DYf283%hik5raD_?q|96WE?sXGj^h|JrhmX;Z3$zW}0rh7Z{+06Xp@$wa-AH@wq4SWLB8vJlc6)`*{sT3_7 zL0$|+Jj5ya+GICc8_(V6WU$TjA{_KQWN=-0ucH+g&c?#z5g>w0EZ)mu5GXtCO*-Vg z!mJ(gcphM@?uDIR3JH^aPCK}`6MC>_BQUac#WPcUYQ=ul5VZ)h_y@Ea+x$a2ZYUAI zQ!r~zntV#8^3_vumr(k5c+h!Brgb0ThR>B(jo>6w@Qk54BH8|(dSI(v6LspHfJ2t% zbe2B;vh|?RptYCMcDDK@!)9mZX2_xcB(fc)wvj6*OtLwFTxvgJA^YDLWSs9W*L@}8 zz0nR#VaGQ^rGlv75E-pU$M&!#fg+QET%YKh{CqsInVzzpZ3yV(DaR>|$wer{HAo;Ys#C3o!o!@5CJ! zi2heBt*4caXjqacKoUA=f<0~lByi8*U`$T&hE!w305m0)wUu47Hf5P+cz<0;8qW7# zE&yX9yZHwyUiOVdAz#iA*N459h5!D|bY0F`Bk5$+K9uK)>-ER+j{Vivt@^It19br5 zp+0CCd9H-fR$`uO?4AqU~Wtvv4rLbPZ5R z;kL2h3~I-G;j$BieMa9$J#zBCOkyqe6lc(%-oKho8^rY(>L_s3H3f#|oT1 zb#x%ogq@spb1kCLQOmgYM}KIG-YI%}t9xsi$N-aaV)moYMrxB1pEq1*=B_2i2t4hQ zaVh!%VqmQ4w_!6^Vc||b3Yc!e0$UU(92|%N-P!jb|6=3ysb> zYYQU-X>o`o0gx`%8r1e1nI=$mMvD3rmtTHjZY=?77tk&$;xh_coJ4FoBzx-gf%K`T zkvv{b^7(ey9YJ3N6tr5D_Bts99ER+}$SAq6u*nmL?wW!y+TWc;&HXD@ZFtjWPU}Ib z3&M9mCs1 z^;Unm0=;RRb-p47ThjS13+pOV8|kuMS6$l<3sIY53l4Hf-j(JSyrb=U^bUub>vImZ z{Tre1Fz_mdrW$Pse1;QsCQ8Tm#P;Nru>$;T=9jt(srFor{fV_8;iWcVXHdZ z7(;*@IkO~(>jV4lxHQASEQd)4WWEkX^ly48PHTpR2?K%jA zLDf}~1hM$M%2yUxXx!!&uk}&tT0uw>(Msq>w(XWMubVUTLGU7<& z{4H}%IK0GcHg);V*3kG|ko-0xx*QoJrJmt6D6U`8ADk>TM@wPImX*AWhm0z#3|S+n zI&t@evoI@?*|B7+dCk+?b&ec0nKuVrPTgeL%)__loVkwb{L@EF+U&$1e9XAzu|0!1 zxiL&jG-^^{rypEKmi1Tx_j{=$eu@x?&#LwSf5Z-yvkd1Qn%+Cf47?}Exo-=t{40cn zXJ_$G^$|J~1+)I!3(dhoVEH0%FFA8PF};Rh*C&`563Nm=Jvvd`#&bby@wXtvgnO18 z9`{#SuNX~uotx9pYWKsB=fV%7RXnJFRCEgx7HMC zZ#F~3y_5}YD7i1wLGhEGJuFnYLDN%jJja{+ff^k0&TMi|OUS!~H=~g61pY>a*gLAO zYBy1_3^rXzI5z6!E-9j&};sb3FsY-XC@#xMvx3rm_}%+nh%CJC>#4tm~do;UGqt5X^av z&}Ee6Judlud5Pb+3a$hpDXq>tt8B7VQ96Rj#-KQhqK=CN-|??2SHjVxFbNmFrE!Zx z%+R7NGNBJUisr;S2#x3L-Kv~-G^b}4^cBqPBuH65xH2aH{4noZ{ssYyxQPxekv>a662IjgG5^P;#0RAYhZ0Mq zkI%3___OT6UrAm(!b;ox;o|QvramQgk61C1yv(7yu*2fbq#iVWc(bj#Y=M||H~ByA z$E-fV^{ny-tAhkRKR%Q-7(+)W@K5dw$JK+)@(F8uwOszNiugV<>{#=XmERy9B6LgU zR6Ty_M|YMO_ZtRX4AJk1hxT>Ok{C0U+b;D#)kL*6cYf4r1(}ZkYK9b0GI~F$EKDMy$Qi z4}FYSs*JLRV7KcDsap>@U)!Ccx7+ujWNfYDR{hWquw8l$J-0yk{H5+#OYnmDuX`Uh z!gWCY3sy3U@lOWQ^8e1g|DU8^kD9hJo+#R191JseP1F$N;EIfPu{AdMj%*uL2+(mc zJJ6&(Ha-@F&2gJqZWimUzJo6Q+X7WsbY;_5vsC%BHn3HM zEv6d=;gb-RxEpMMXlaPR=^YXBH{sbLhZ4pM1uv_C=iVCT9I7g!UlSOMO6@Zx;w*hu z;RMW-qqOLX>5HVKUYZpOoRck423XmOB&@YsR5ewHOETi%t&Fr<&DaZw%Jy9y(sT)$ zt0hVM2x0d_(}4IICNc`Xa5Tc)M5!s&$+VmFjw94k_mQTKu0h|*6J}Op0d*6V0)_fS^hr~mKDFuj{v^8??OU@(qP-Xp6a6aL=p?|I4LG^L4wn71*0atS z12;$$%Q7o?-v*9XlE8eapR?3B^X;6(L?IS~1H7``KC89~pQ)3%vDrX*a0&+J_mpjM zK0Pn)lnnukC1{#J z#XP+yT!`6a_>&MBbWYsW+9P`xdWVgGvPIM#<&57 zGyIh^C-b^3tHt&`{FC#Xq^Zo%pi74q$4PMj)35A+oIr>$T6*mXhdNImT#x)SQ@GzI z7KAIR&NZ4UfEaf59PCa{2kALcQrjLAgTxs%8H09ipMq{aVFUK#(k4C*-lpuP(z$f2 z9t9iK9K`T-lVuYLz9d6xSk$4RA%?mkL{Dk*zfRV!o=2KL-sBSqIAOz!F6OMIk^XDD0MQ4GmF1O)$;2;w{RnFy*O#{ppEsCKePFnk&UJ2)(@TWI!P<`VSyrG_O zQ7_y})(El4Hg5meb;qa&Sd^3ky!3zyboUJ0#k#?-lotAzm%mS^edAk4nXpl%x#9axaKQT;we({ z04pa|O!-2X6v3jQ^h{12^$Cg_k$%E)Z*VweYfLY`xv~;N-3gEi_sRM^q*9QxlLR96 zgrz-yL&%U*ve`o(C*zqD58~erS!Pk05WRT%;5O&cE4T(v;*4^i`g`QLl){l~UK*wDu2f9h~FJq^&7u|Iv2WhuHei4s5{LqQmlz%&q#pbJ70`i&Tx zzRA>Qj9-!QF!6Lv%_tcmd0AW@DQer6wy8DH+onoMl$1U#ZD@JVP42X|wmkc)zx8Bp zCqy%8miS*xdE4(id+)y0J^R|{d;CpQ22qRI5RvRsP$nfIU+MNQNy! zwNs6!5Y%b(0IA*i3(|+6Ok8Jwa-5kRhfoiIj6#xHDNr@w0Q1> z5fei)I5D0)nIS~wzy!Ui&kG!*G9!;6AiroQ>P%N8L1SGKNT(Ab?F@7SUZ}1MnW0os z3Q``DVB`tQXs~6XpQDDA68s`(q!`OYH1xGQ#)h`$r~n+J@D{O+Och(v7+Fc;4xdR^ z4Y>K)aIs*mRpC@siki?7(PiV+#z=cYVS@}py7NG5OPS~=8(EAuUqKJA51NLsagmHw zU=@R@>roe5#cWWLr8I=JcF(T_UfIaXZen8QrFrH7N>PDy#{eniz|rZ55xO zzWO!@@5m?;A*)dH!k|q}r+|$j44;EXL%(A&e!G1J4rcZH9gWB*xq{D4!B_XPvXIyW zU@?dZ7e!4?MNVzdPoxmTklpM3_m6T7h7qW)1n$D~!7*bhSF`=}xZx=?j`R}}fKYFe z%vsJ8AD33LH+u4r2Cwl7PfLm!`PBF+c`|z}1rEc0du*PjNqdTTwW(4i#&tD2)b4g= zM%F@Y^?E=unaAcC?%C#9_W2o%D}!bhNOJ6`$VBvqK`i>24=Yctor`4C}+s3OomjvIPIaB+e1q3fU^h8>+M&JC?xyFi}*!_-THuT zRaXT&FP&N6emEO^Eqfins;6k^f9RD`cp=4QYw5+5f_<{ycF;;v1H25uHtw5j4@R2I zNV003#4u}JjBneYA?ZeUza@b8ZfA|=tARED<-TXfe9iRLXhnf7>7b(uPm5*bf2}&* zDWm@dbz|g%aV{?^R~6VHoqE{z_<1fumo(=(3Le~2R{3CxfB!L+CGCz)IQTT=-O~<5 zXkZB~@N2^^W`W``==m@rexHEzFo-r3Zs+f(lVEx#mGd8B9}SOv#h{em#5%gnQ;=sa zc>;yr@+nCyFXFe%gmr_#B&z2Yb+)j}9qP+3mK?zZL!&)wG2vXd4#&uOxb*6)yuA`G z$zO233^f5cG($K@PU70NT$Z?G1iphIryMjC3Umxs6ajwf!9n7jg8>ES_MR2~b1P?E zO6?M+-S~q=JsY4ofKr!-Qo_$i?q%H1Cyy!D_!Wb#h_(#Jm0`U-EtAOs@vAtn@ST}g zF9f8Qs!@-pn0h!JI(jRG15YgP*Td-E&CHBG#}?dR8du)TjG`tpkNkc$zYl~ysY>Tg zXpBA6GhdcnBy53avu=FfZ%t3@dPkAL#Kbv{+gg&Gk+yYWOHVVF+3EqYFyu@|;{$Bu~p z!nXLSU9Vf*_c(_aP&GKNa4E{i=b?T=k(4)5LmJvbNv;YYx~|Xt;cWYQIPe8-U^d?d z{A6fXgv1@%|0F^I1(vJfE}uW;P`_rvgdN63rGs5v6rkeM?!&3nfl6w4EI|yvEgt_j zeJD4C%XBGBb#TVWm{vkv4k)B1qPJZ3R8eNN+g3OE8bgAHG_JL^xxQ-3){*a7BbzAc zs4GHTcci50+chgWV`PFCt@1XQsjAG(9$t6xtJr4gi>|j?(_4_Z;##_C$wBSAZRNbt zt4wVY+`PyrG#=5t^<~OgW21a;=3E3`Eu$<_9dN|SWw0l8g5QYdT?U&Kn*qAN$~A3X zRm7aZ_wfWd!@+8Z4qjvNys{Su4>y711IP1Y1G2Meb(sU9ww6N+2UYb_1XxuuR^g56 zX4`~-wUtX#)vG^)kyu;d6zePm@O%eMK3EW2bh_Xg| zF(gCXx(#kyVAi^$Qi{M?!%p6rW8@6qA!d&A+)eQABhF3*ed}i2O7w?+emo4` zkApuDH}inJQPA9H#v>dqfZG55BJwf<%6&Ho23jx&iKX?fY(#$j^{@k)J!ExSF zAm*Or22q{?(9aV@pK#cn?D*(`sF%`1i!Fc<;Q-s|hKDz(oo?6e#C#6w=AK0dq4tHA z-RX^M*dW{oz7LaWS^CdyInFED1kc1TzxULWk6;JTPd^6<(cBE+w3^yH8&y#j2p zs#Q46WdQNzu%IQTU2+`|UkU0eh1>CGGj4eapNCE-fxM)yhnCU}d|Q4h8VR+Kaw%19 zqL)SRl6CbPx0*h!I>P6GzakY{rYdh+-YA^V?UK-eyzaQ2WXdSyK`G>&0)Ms+7kxQs zQeu2)a|-NuH0VYE>YXCWFyY!oNcVTcq-ox4=K7ARKYqWw&_^s3rshM^NQR4#kdj1$dPUNbTONqUh_+}E$-(X$=jC4#7rNp zvKf}{%%LEizHAgs5Qls9MA~f4?=i%IGv;nHyZM=-&GO2JYnq|F2PA*bo4j^<>V4(4 zC#GDAZtufNb?d{CZnyw2=2xU@41B1zgI2%3X)UeYvoit3;?t{p5!S#JD{KWn$^bL( zv<n(y10FtT!I^_M0K*#j`ZTi(xH+!VPNkJ2OsEnvzsuxpZ_lL(q0Hy z^MC~bNhJEGQNVv0>-XO*eEz!?!2c_W|9kUqkNai*%?>?`jgweq;f@xnagBH`j~C#` zOA|^g&yz|h5Co6DF+a&2R<0N~b%{O3gWOK>@E(05%aS4@-br{-j9_WX-lRwvCgHu9 z%49k5IhpF1n#uS7xWf&AsWC|yX(ym)tY@|~rin(YTW_~J42#WXw_`3bFLer?O`xSE zf9Hya3WT=l9%X8$(>aaSqROs1;K+B!YK$hS;n?Q7@`U$gsZEPWdGoBL2r4)ge}iAe zNP*6^qC{J6J$J)X2WQi7WldRR0?3hhxqBOD5si21DC69jfeNx~!mZxkM=|KTkQt%kxe6exyyO}c zIC4&d&h4EpqL>`&GUfP?Sa~YkD%gqiA`@WdpSgMbW`4?j?!DmFKGKvIZ|}`n$@l*B zd3SRYo9nw}^Ty^Ve|9yF6Re(p`;&7h^QaZpRJdm1hm!rYO@}DQ`r8upebtO=Y;zrD zjQVDh)y+4gGm7Vl+|S18o`Qpx)sl%(t3@vOeG|lB&cq?6-)67x8bZmtHGH;5U*8@F zgl(xr%sO;zIp(e6C#4QsK#|%Q35Rd%e2U%Q_jhLq8!zT4j>QhEWPlAUG*{WZ-^Ek6 zcX1u4B|r=D-Cj?=_m2h99U7#=mWyQ|J2&sV!5&HtxxZBK0$gxbU3zxo%tv=CmkJcW z@;oNqA9oBmI5pRUEizS}96QPj=v&oQnJX#IESw+ne>i-fU{7;;friuM z6%w^p!(zDVC860maUq2DAJq+n12+$@=`V^acPkHHO1SdPvi0IYI7GY5D_j1a^t;fr z;02WrxB#aCY``=SK$#r07NZyaMP5?F3s^CI&?fcBeK{dz%Nf88C~U?yqp}?%`SVrE zp4}nXRLU$ZU`Jfu(#&QyCnw&eZGo{fqPbzt86M3%f`2C>ZR#(2CfV?S+9O$0iLbFv zUqi=0jKsbcK8Y3CfESGLfZ-pO8p360;FJimGtX4Q8#Ty3ae+J`qI@7JMau{*&!GP* zVz9UBd4TfrUWvx_P$;_gZX(K;>LZn1ge368Y|T) z0?8r203!JCderH$Moj99kS&^kF9d%fWlBg*ZWtiwgrUavRB@DtaSLvFmlr}^Ak`gk z)x{r-dBgqwL><47#{j=M1oZuT8@;QUPYCzr*E{~vubcnx_3Qt?_@h1Q>+auGu|BtL zl0zy}qEbs~RzNIiWuob%ks(l8{y}K6uO7dgysO zCV>@e41bvI0LnP*h`KIoF&Gk}Y?Pbgpf#8h!s7Tf$vNPRRyX!Qu)>=j6K!CT3t|!K zq!3K+$1XZ;xDfeV+pGWTI2j8tJl!%(SWE-v3M$iMcq$Ik3ExZB;Ucc;47JK}J^?+$ zR%)s{!`O`+lnI+_i_TM6S1Ii1jUCm;r@MI77al!WkcYaH5 zuuU-fu0>k1MZHOA!r8ez;vwJfA^3;Omy=G_0ys4wgib`KnPKxrc-_ryb+I4Q3OAw1 zRHbB|%;gZwu^(7)onpswtkOIZ4Y}7Fm~n)ITjlC@bC~J))h15bSqhJ3{*ZVojFe+D zkg=RBaj7z^T8oW;(MYFDxY@yVzG$Q>&PuNEftB!dCY7EHGgdzmKfDko9pV)^R|ayf zGRW-QSBT!eXrwWvo#g+bkskb@;p{Gm>dC8#OZ%dcT1Y7>mzUcrt1l2pIO^6#CsZ?! zp5dj4h%Ix3<+(;gR)vCMx}_Q@M%@umV&|oMgx8@k~sXC z?1ULzk=hW&Th3fXh7W76vh3E7adCHN@oAgTy^?BPZm(}ZMQN7+DelSAMC>L^2X5D^ zPCVOzJQ!EDU}ALPw^fVRerCL}ayvu5!DX7<05YqPhLzk{fYarsiv z+G;tjR9#>^vDsl!_0snP{>0N3heQL8Zy|-%gXJc%L=U``b$<76e9-OFhZUbo$BL{J zmn`Y{a4lpI0n*(3R9a$$##MaL>?b{-uBANWN8Vl}21fz>1LcD*`QvMmZeedU#Xm=W z(29kH%wp$hwe?}g?e=I?-YS!Z1{2q0wu-XvWL=D@grh?IEj+Rv$hJ^=^wKUxiTwFI z!+fZOt@hqwd}?eo>;`D9VqAGFtMctHYvtC6HZ8?bkw+rl>|;kf%Qh(|uFG6Ha}k)U z#HSe#o6H|0Tj=Ua;{DmVLFb-gxJzC9H;s$~8)#a|urFPeHY%NV9DG_iudT0OlqmY} zVmag@+8nFe7W$`~O-+{!_x4vrVUZ7IqzsE)CYpEnYWg|+M=bMkM@I7mhHj4ipPn@F zCuV9Dif(3dRpb1yYSF6wDAjKiw$t-dN8Xf1bH}{tH|Rrki(x#pNi%cs&+Li$?tUu% z+AJJw3qrU(d-w_zYD1}7EhWp#4oQm+670~japmD-DCdHwlgM!rb?j5S>#;`cx*cdM zwbiJ-W@~L_TSlDT_PYN8B}Mw6+C~h+hkmlf^o{jHY>Su&x7Z;r`@SI^VaS*yvMku; zrUlf02Y~vMc)%6zT8_?1&PH$=?|%2iBw$=56zM;VXba)NMD7T!FF;b6yDoNLFCX-y z+Tog}dO$;Uf?g0vxVW(Df~;&J?+jRT9md9}Kjr=fVpn*|eP!Hi*9+@rDd|VMjd(#R zvNpRm=qHH#hVH#?KlwoJ*xz;konTh*j~jIO1SFO77w^otCvyBt&M0Gp zX+_@P-bO^=B1}l=RB8;aSRW-t)VJ%ZpjT+2yuDlwAZvj`auS6I7tE_Z5Y z<7@zRtjs7w?!@uco5NM_wfEx3-)nNqtP4&$z99%% zsBWG`hQRN)uSE=Ob0_McQ5b1MRtnCZD$^%PZ1hlRMk=jb%@w?<17vv6N^lruOY>h}5W2(34`JWa58R`)JM; z)n$!VP%aO%$-%P)j|X+{2r?Z+?;SYvBF>&WRwfH~xG74$>Xx^#5kCcXcZuKzA2ixo0`BF8*~LB56iusrV97ZNGNKh8Gbjd;sySy+#( zUtIO#>nf;siek?>hRPMs!+o#>52XuIMiJB&W}iXT`#;inuX zyOCG0x|YrqtB?vs1j7QoC>9{5k%c5XC983YB%L9dZ~!-0CFDC_du1%2C90uF1PIomu4zx)A+V?ot&sX8}+O>2#h&){}GM z26tA%z}&-3!UdBQMj6NkO%zbL^DRMu`3^*kEYXprkgJ7cDMGV2bjmC}3KOnzoTu8U zD*IgNX%3GAv6*QwnNZVEDGEVi6+OI)}q!@gr8O&jhm)01%Idq4% zhHc~gu7w~R%?Pc2B2&v!NU{=cWmS>K#O0g5$ADMj?9nUc@x-kX~kAb z#u08zGs<>jx?kOsNR2#}fJ_#js(g7T<8!tAnAl>}o!_4o8^QT8jzq4*@ zNQQ?BW-yH8f(Olg+E$%Ddot zxkJe_04@^U(6+F$SXlk}E8RcMj;@c~dIHH%0M1LISBg$PLvPit{!)6TIwZV_-?&p8 zBAZxgEa^*!hwAp-EIu@XRL5(76ku;-Wl^^~ueG@FgUTM`sBeD3n>;slU8Ms)L88+4v<=I#Tbie{Y z&fO}WLTM&yUXX&^cE@3Pm=Tb0FBCPix9r`2B`%qv6mv=IlcfI=5l}iDkB6HVdpl`e6)XvnS zZM!-GO4eurN&YI_`N#z1S)7Y|^+(7(?Xfw_q2;Of_{0%E?$xNRO_ng_25%QuU0u|=k01ky{gR@Mg)?z{^8w}|% zmmLq-^-{65S{`B5(n)e}aJzMM}nFzM&yn21|}NU zgamYFzjjc<#j*A*MM^a&KGNn!5#VfkHIBHIc~5CDps~Iy(9c={Wd_4x?iYM%gP9hY z1dN6peOO7g&Cmuw%_(`B7zqUOO(d5&I;^d-aobT{Vt?E~uWG(i-Z;|c4KC7c_TYuV z-~xgMu$UG?Q-0+aBJHK@Stl@6w%Cg6YFBp^`#S52Yj^Rmh+#Z97~swBHKVH^e5Z>T zMi`vO6V@t{8IQ1dMNW>+V9ooPfk14|R&Kq7kjDXRi#%wqD%KV0^hcT6B zT8x95y|0GaJ7&1FrV`BHF13+-Lte&x`Vc~;%;%!5-uZ#Yq5G<&+%Fu4{Q}!dgY|+_ zZkB)BNU)OUWukM(3WGz4RNSqV@yC8I+f66hzM+K6)ARuzdXg4Ue==unFt$73ewh(> z-9TAQ+~jTktF9LD9Ymnn7+cR2jH8)C38SlM*S<`7<=whQpL`B8j=h?A#om)76NeH= zK>7mXXEhXm%Q6^(%#*1P1I2dV&awHTX2krj}{av(K1~zKDpsk1t*Yt2v zBn=8r`D;GB5-0nDKUo<`Y9(uppWeUYtdS8jr)Ik3-%nVZ5hZ|q6?w(To^tqe z5W6E`1;RVz%_x%4T#TX=HMuF=9*>y=*1NH+MsZFrX<^;%QA9 z4mBd$q3kLBVRAx-$0DiLxZV(YQDkp%EHg60+eGbiCW7^*97{rPSgj#`>~=TM1>^c!qg}1I*7LbYaC|;@5d}hfi9;R0^Jn9 zF^SGxfIckqN8r*4`Ym0f_(slYnBV#GX>3&lRdXnvz?2A4=o>hvm+`o^WouViovZY- zNYSZ5u==7gG%bngkK29>XvMc-h!X#huKitTiY*|2wDj#FrGxdPajV%YGOdXmX7_^0 zi;kA1n~RW3Us8SD0z!9MkyzkTsyXUhtj_Ygmh5@^f{HLT zc}lQVY>2!ocArNatP;tJw`JQIhfb|)j%Vk504W+WBJF%BrvmMd*#}X&GDM`Kf|QQ=%#I}b^J59_rfw!a z4SA545fk6ocq_PPWG%je`ReP@X&N9T+YxS8#nUz8I_-|L>kiHCXAO7cM=G4$!4K0% zNxYgIMIY2~n)0-q;ca;sy5{IlJx~}T!YIkW)K2C^FQ(ASjDZ`od4`Q?^OX!HN2DE4 zEEYjrY!<;>U(Eh;)C{J~`5Fl2J5`!GIZB0r|XBm$bs9lNausC_QL zA1JG0ZDwSniu4#nF&uH-gs*QGKe$ zx?sB|)>fQ-6)@qP`*aAs9hvNcJiDmtky#XWK_mN0w(OZ^2D`{&hPg-{#yz`0moj46;#I=wjii=dPP$k zr-;yib!OZ=5X7>CRjf9MO^03L_DsE@(_#?N3V+LkX*zY?Lsk5?Mt42R>jg4-%5?7y zzIjUQhq#qKm`pjI99~z<@Wm^zEj`aH2lye`85^VXI%XJrv7Nze@`85%PE?I5D*1Gu zL8PGJ|HLD*NB{iHXfS}Q;FJj98L`TD25t;Q&-6RN`eu4bow=z_HzDy$4DyevGd%>9~Gp&$bE z{h2L}h21R=roNF_lPUA$h*xgkktQCqCOh)99T_uK%aJ)g{f09;l_`E!KWb9ZF*8-P z2V}YX`rt#fyAOQQ0pe%0XHU1r!^qE(2`^eTWBQd_Kl=QihYf-5IG#GQO%wz_k2Jp$ zh~0LFj^AfDJTLYh%?R3VJn-YS8xS~d+Q9(4=Vtw1T{(KsOuc$~*Fl7VO7qmMg2BP8 zq(M?>G2!s+1)u*O0UDmuf(d@*+)`-%$;S!&uZ#fylWn`y^7K$yM*qyUu?O5kBWuD( z!E*{pK$8{}fF~w^N0J4|h=7swPIZ&X>+Qs_*ax(0w?wy8x4_xzZqOJx3d>?u1TC*v zJ+D|*tJ$_}EHk+2H=p!An~hIpm`3=06cZ9&+nwZjUvc$){oL<G3W;aqe$SeUqIDIvQLauc4&x%xL+S44*sgH>!ISpe>|}2 z@WZE<||<&tYE@W*6;n7d6OVd(d6yr4DY_xfszs+SX?`IQkY0M&MzO`n>{A z{t$cq!x%=u(HJHV-8uh$Pl=b&O5kx1r&}Qo^EN3YzoP+<(Hps+w&)ELRWJ2M8p$to z$Y}5$Q|GOR|{Dvfp- zc2-ADeMu)Wq%#Mq6wVOw&fAOH&d`R3eL0S;I=AapCECU!2aTd^bM6dkleqEGs(EeM zqnJyJI-3kot3FxwSRJ19qIq+0ULt;$olKhEQfx}aC0AYdrwBTRd@Mz+jar*tg^l`q zr;*DWz47WS{7iG1nI;00oZ?WoGQ_ug=Kb!-EQHDGZJjK(MnV`^9 zYsxvD1k-9O%($gW-b!u46}*qLx6u4{T#4DZ%Y+sa67_EM8BFxRfMwpz<)JtjS&W{1 zGyJ);0?VGvWAocra&_Ky7#Fv&DbpaHjYdoYj=IcY(3SLPsR}4##@xV>eLdGYwQoq+ z0IT+3g(0jie7VxWSLJ1wm%N#@sa-!IJ)98YkE~N`NKVEZ5aQne)jG|vFHp3DX_(Kj zPp`J}#U5guzZAx%F`kFNG1+1nS8dY0j)>uS&q-+)mYGyin=B}sRU3BT07C+Q9lUL# zUz7cVTN5PjX}IXqIwJ0(lB_kqY*)>(n~By9t!#|KRzcm#R}5TZ7=+FvM)6=u@K2cI zrE%>+z;*0g)EG0>!ZO3kZgAkm`BkiBrsZ~!Q20aP2FT%Ieu+4Afn_G*uzz2|IWmQA zS+a-H)fn(Y!_VXgi4Fh*mT_r%F538j6jtZ&XWkM1Bi+;Xkru{MZb47G7Wm%P&eEk= zMBEtwFW5&kqM7nAO=s1U_(Y{R=6ZK}j?&<@K{YF)e_QR-hnTO>N_dN@MbEVuWAO#P zCv5Q136Yf*dA=*s!6-SiFD;+bhqIIgM9 zpjl*;DNQK=ThIZ~*=nFNAqJWO)u(NYEHRpi);1hNw?NW9!fh0y={Q$#IWoPhEE3c# z#j!1!ZJnJ+>)#+rTX;F5;m zky&NQU>L@Mre^ynsw%e+UnrVgBp0#(SXQVNxi_gQevK&!%E_1UyK|iCP+{vWJ%`SCkBMFP>g3(X3HM?h++ZKGBS} z4VVFPS80FR}D_oP^QaF{&vY!QwWx!t<)@2bqN!xHswxUL7t(03HWo@L-CsB zE{64v<87_pNF%3OjodC<)^bn+K60^g!-i#8{F4Lk#HE_I*w1XgYr>PO*cDJ)&IOn; z^S)J^LCr@%g$RM1HES7Nq8hE*0Ft!VmyIPZZ%t%^k&l$Qa-h$A>T#M{VfRR_TAtEsoj8 zOR!hvq=`xJF~mw=W`K3SO$+m{!5f%N5sz*mv)7`fGD%LSPK4GU4(UAG(k8iAHCBLD z$QQLoLX^A)47p*7BQAG@$S`veipOb>GEXTvH3=tugAe8#CsQZE-=7Vjk2I}HAIa3x45)i%CBGalGf zkd^7$kk*8Ag$Qa8`-b{CNr| zP9G?NRb)k0HKL(!Q)LWjz*FsV*{NbH*Tds(I851%LTJ--3px4f2>3y{3(p?@=mF^H zB>#yXl4@zq z70Ufi@X7(*sbuJsaco1&&>y$D+=N-alX*wcPJ3ew<8tkVorc~_BKHmEvLTNkROyfA zMS`8OJKJGPbKoAo(ES*`Y}pEAQ$rm@?^A1Kpoa)&@Hs3%6l2klfJN+G=v2{Y<=UVX zmHRcNEGq;(^ilvA_$t3yn8_E*XXTKMV+H>#=CLg&yE@hT#I(N=#F}U(peBWN-Yi6S zQG%Yi+!FW{))E^t5;y4YjPEtzl+XjoY+zd*FyuDVIxmiL-T?vcJ`U2JP z1SP08qY7f=%9VXQPf^M0MuLjATOPPj9DA}7>v%VjsIebuIs>+y5HR7nk3;MPU5;jz zj`uBG<{H{rECV2cHpTTYv{qMt5_{ob5Yg@YG8wgp8#&e?Fgz-I-ur;-sH=X_wYXdM z;96zfQM`kAR}&#YfzGpagIeBHM<70FmlE~#QuEcd24{Lk{4={Xk>U6TCWq~1na{Nf zkhjbHz4RtX9#o1+www8zPTqM6zM3Yr-bx3ZdDeY>Xyxq53Juz=K))^vNL8gTvgos8 zHMI7tcA(K;zl77DCz^zV5L;PB%EE$_2Fu{;aq`F^6UIU2--l=01FFpgqMnO?>D6Is z<4xB5)y1G(FB8PNoALqwe`tHhSX;L)N_Q{Ywr$(CZQC~Y zvTfV8ZQHiJ_foC%u#+mB2{tT4s?AY@hw_Qe=MNE@ zW=cp9Fwqq(21A&Ylxq5bpFt7)nU>KvFTx&Gv9bYN;vnzsbkk(Cu$XqHZuoF+^N7eU zE6xhE>h^t65o>#1YZ z=`Ano{O8?10QFFixey<#q5pDL-!gk&9mg1{M_4)T$RT@h?jgO*0MXHCVM=~i3j(%~ zPIM=NNR&(yoLZl;IZAP!LF_P%z0D{r7@`a8S_G9~vsG z;9H@*yort`3JY8wd4T4@_S7cGx4;s~vjRu1ivn5F!Kox@wl&4skWlk`9e%)XkuvS1 zJ_*6$$drx>?RWcz;_cZzbbs75L^ z=s@g7zbf4dt?@J$N_59Ofpbjl9-!Z&%+~2=_bIt!Gw%SgUP-t|LVQr^4pq7W+3ql9 zj#}n?(Jo&arw%Q<&=Tex7M$#_ecXHNU{-ncF*KKIjQo_Wmut+C={MtK9UaO_$`y?`-Wu0~2E_p_@K+e%6vrasjZ zxua(oth(_kEh#r2V5w`$wKLuH`+YihHxd;$kWo9)Q|pMjk)7-@RQDWRN7Rb+H3C@P zhzohHzpirRAU?x#W3Z!E8wrCqpI4W5Vipp*n_~-`-0fueTvi{xH>*Ig+F$4;+w0&b zbx6EuctZaWebs~rqN?@iV4F%#sXL7}R!C)pWN+3E>-uRVTn5`O!* za&*N87!l)8WgNEB-iZ)V9ysn+mOz@Au)wq_HcI<~e~o;xNRypZkd4-675D&g_Sa1N zzHCd_Xr~r|S#j#Md6Z-NE7BerZ}uLT>HiJ*&jsK@C1?2Hk8l*B{Wsyr{=X$0|4T6@ zCrHU{^23jQOZ{R4fJ}1J!sJH*gjKf}!Y@KrgebQlLSpZ;u#p=qnC5I)1%I4pzXN!a z4|AYqDH9gNR^^J_<#sj2%e}$-b)`StuLd>=+rv=?8TBRq52Em62t6XU=^sR42~tGz z(uM5bj0^|oOo${_R=TyH$b*K3iZSd(y>!ceA`jBQp_&C=C?VfHrABNT0GY5dduxuP zotv3$TGcG{__LsrU>k;V_XgFG>TO+PsYW9e$3Ot}BaIXDu%NV=@)4PYgz4vYfAzP)n0EK)#I z$Hi8Z{ypB@|J6~_)vvlj5;8HJp=PzD%qYftx0>AZ4P17v&H1CxT4~4z7zx zs3T4cfF=f(;O}pFV|+x+k=_|%V-l}uuHM#ac5QB2rlpiu1J4ktP`tK8)9P$(*_gh0 zuc^LnzwJ(+k`6Iu4A0f;tv!0**`DEf=Xl-X;=Vr+iv6W7&?zY&?8b3#+a)$Y3vugW zNVP-8dy7WZ+Lm_!gb3StC*VC6j_AD>uH}&V<}Liod+9gOTUu~zr#;t={k|-Ay#3N| zqqpGTPVKNmT(p~E1hSjKPuZyv2M984^#I>{4vKvMG9!;VU?B9QAERQZ)E&Gm$DccZ`53*x!lw{5VD*;wCu9})S; zy~MjDq{@32upWX9yNKCV?6(&EKU{`)I$%9ynj^iCu^e-R?u^IZJxFqgV1ikAoOe-3 zvj<|d*8Q<0AHq$1E_-H(If-{rfkbuP-Gv67vvTCNOHXl@@JIeNl_7Lh!iAPe^1B6< z^&2xiX&V@DzyDe`=j_yN6kafpl!!cS$nL0Ao_P-8wqj_umUz(^y98VGfa)<7=Hkv} zF44;TsN45s-Q>N=J}kvT0ijEl_@}b^&v<#8%5~;wYWKx>de76C?11e6)NfQjB!Pz; zTl4i}JF==?Z%1u3Jmmogg3pnN35f#A2N6N)nAr`n(13gmN z)^w-QJIji=MCVF1Ref838YI=wfb*nwPZ(}Ag{SnuPX?+cq2yS>U-x136j_9Pf_0f@ zcR;yq-S&!k%i8|87Nwaf~w0e?JwB|nJt{?avS$=s?MO-JBD zRuUK>3}~PvQ{0=G8h~zcdb0ZcMhjls^g)#Tp>ybQC7xSUFMpI5GCZNr> zbX4()L`BK5lLqEp#ChNt2R>z507g`J)t;C?Ts`DT>_CWm=yh<_(lv0%L4*r&m7lf* zSRVV zg0zhi9;g^_+1oYw0Qye4=hlt8qr>1LZu|5MweNpE{t}kM`bY17!ApDGR}~LGS(D_4WCIK z7dmxlPx3GzT#~7?zLkd?Mil9kjy&_uhpZKjH0kh98B-QWMpPMZN~$oa$Oj3QK`N?C z_K=oeqp{6FT!t*Jg-=qQXp+R&;czIHY|_kYkF&oC!vr+ghcl>gH>&uSm%nblkufu) ztYE15JzcgIijP);^R5yrZFNp~-<}4vV5Fdfczo`nOi{uiYxhh%s~?N{yhd9S!mVai z|A{+n#L;0k^n4AH!`N{sD1obck8W9;FX}NAbw|7STFH~*znp`-spds(Tgmg2-^w3m zw2j1Y6|XYrH54#=6U-WZ@mrPkM|QI!lzlTAMfr-jA~&)71EaPQlYH8KQ!H~toaF+Er|mgO z^9X6LtW2A#9LngL_#tR`Ww=l!w3K0!W0F0)6tZL7h8#7&G7_Pkv?f|XlU%SRmHm-y zcO1Z`KQ=+y>@Vl=$g&T2lC3Btt$?U6mUTCzs2t}kq&BG@OYWz2D6V^}OrHzMV$xZd zpE|>I_yRKW@KQyQ9r?asDnIVg;1=g3P`+amfOx|4$$S+GoMeI2&tpb7UwSc-K?IgL8Ccy{-k&E zdVOJTZheo$O=A?q1dy5yv|)5V)3mTQF_TreRCyqo7G&%?e6~e1Fo+OIJaP7vNdL!Z z_{y3u?Mk*&4CD#@)Itb3*~^vwl&P_+Vxr(JJh+KghNa+yp&w-_1OhZd#++CgTL)o~ z*ZqPDFcBhXLDf&pNo%p^B;;C##y8v*-g36;`zSw7Grl42d@zV^xSoX;i+U@Ngvb|z6s*)&qGP?Bks&$?tSL~ezxX|DuK2#OF)GilDS<>=2Z;Ete{2ECFq z)Obc|a>=#+cqh4KKK91b{m7_nt+e4Z#q#MwbF~@^pGf1t6WuKK)5PgFnS7|}2(>sBM4Hd{c?CC-cTYrlbYzY$ST6=RPiU-^5z-I0BkUD=MstL(gPT2YPlH7c z!McTU3K19Ba|Fw#(uo4u(6%yF^T4$P)2 zg!D!VMYbaRW_;&OMLPStVmO>yII}n%^9&=0PYw3t@&7 z{<=vpV285DBmuI=32{1yKPrrCqp&f_J74!dx-gi+#}-j&jw_rqHpXoP>OOF<& z&kNnD@kbd%+9Wvv_fcrqm3sb?0#z`ec`aPf%_Uj!@JrtFvoK5!m}R@CYie1&k|3zJ zhHr-GJ2nH>W(ZDZ-J_^FC|>pgtsn8(|FyCLy+`;uT)-6N5)81^e(AyN{~WY-XTG5E zVhHPJCq{9@&v7&4h%LawwZw{TRLVDD>xVYbmPz9Z*EzS{hVi=3x)qzq9wX)eD3^~n zdv^xs{)_HFfO7N~O+P+MLwhjXRnwK#yZ;$PD^a5xjqac?zUS(G^8iKrD`!_uV!)YB zEL)vh*bde`=}V;|Fl9(y=XOpdWgsh`kMlXro1FVw&zTtg%j)uwcP z_~84`^SpM5Utr3-qpn}VCd(G@wEd-mAa6%-MugPYf8YTTp=(4m#%jfo?ad66a z6Tw^k`$z^g*3#C=%k}LCXvw0iWYb~t=42g}M7EA;6!6EqvWfn+BE-m6;kK4ePbD1@ z@(+qeE|GXHV($oWo)NnsK_vBdE+iSX_}*vu~0S1Nu8&p zBs~_Yx_Xi_$FV%NsEBW9Sn;z&$@|fkj%Py#^G_yuibrEsc;I)iF^DjLL<4S8=Fa>! zW-S(RbD;0*_Yki2*Q0Dy8Gzj4R)$O>KNF?&?97nkGBmY(?FLyMi^cp6)Pb>KQ=-CD z{tUULS^Et60jR?wMP-h9*A5R@KO5x*VkPeIr>bv=a#Ts5dVga!G8AO4+W>+q>3BvtITwlzE-9bwR7h6?^M~z;aOFOR;*tQ%= zpdU@O&{jmxg<`Esx~^hP&3>A3h6<7rJpS>A0yyK@jyd)Z1u$LljwGPucWDIxlO}1t z#yn4lY0=+A37T9u7|XJ=OI|&6k$xEFT5ys%y@@1gHyA+ z4?%KM)Zs%56;n^;yiQki5FJ1($$H?MnsHh*W>ee=Qk{j{x$7or0-o~C)6!ApOMlbY zX>k)f#J1~#8TmRH{YOi%`D3W_QO{zoVWFJ-;;rSGd?+SUCoyGPtpQZ2HoH*U3s=0w zyl&O~7>9t7mzaBe*F3ska6Q<}48@uX zEV&ejyfvpTlCP?&mdBi0w8}EUTNFaI$ZCUe-Wh5}m3yQKa3ou$6 zlPnsLEEI0-f4GZIuXpeb-z=GIM^}M4D^Qi_rCU$4C;c4|pbY6mGZ_MFnQUFO8kH64 z>H;d*x25}6qRp$=XPFMs6FYke<~qD}`f;l0Em-&tv^9rz@rHn3*bXz>5=S#;o=~9H zq&P_k{h-_?eRfSllucwH3NIQwRaI6W{NhJc~Rg{cmHJ@l7#g^TEUC+~F z@I!(D(-zi>sYsdpvP5<0r25;AUJ?l?Vs@EkDar<`3f-D)jADESS%F{I!_z|etZ|fK zaG=YYzHF3wCs)axzz$HU7+&G8;DTB+%y!txtlc+HX0T&>Y%&fr?SD|_^;KtmX z-v0?;-S4J;f76(zB)}auZYq2SZgEdBr7C-C=3$8f(V*!jIE^=W2w?dIY$u=1_AIc{Wuy{(S~12V zDly#+slpeC2Wk(MgSe(Us`1X;sn0-@YoHl(8x7NtvRv2zC1jH`_~^?Wi3fq*9qi_| zjnda07PJZ*R}e*3 zw$qp7xjMsKdo91-Uw5IHrQIfKYgB{|0L`hRG9Ce`y@HOj1x9^Yi%t3(_7|_y%QWbr zS@vT>m(zn;2Ot1h8M;BCS>(oCNTPF?#))~N`Nm%3m;|N_bYs56^PTUbwKrTu^=;DA z0{OrkWJ~V!?&6dFg#DJeIb9)GIgSsk(llyFHcEo4&%=bO)^TtYIw#gq&~7u;>u-9F zB5jO8imaCSCe&ymMrV?lc2u5!Lk}~9QdQh6l=5#;^e1s#leXfHI`Tc)2PyErdS_9v%2!p&9-SWyg!C(g-sNXZBlzAQDgHwfM)S$ z7M71Sui2vS!LjdTn5S_ua_%itgZfEtCk8C`sXU?QZ^5nA7O-$rhn;};O785wYh*hg zyATu=)CfG`VyAaU*f}Ns+E$Mf-AFx&?gEk`wrRt1o=J;q?DHj42jp^p)B7m8USOlm zoy*P!H8EY$rlV24ldNPVXlGZ`XV@31=VCA*>z-)L~! z;;qQ;xH_JJSN3tbpg_L!q~p+UzFPM!0A@KgoFDNS&ZXZ5;+5QQyCO~W`H!$aSv$E< zn;-UlMw=a(r8qI!O-Jt32wxP5%FURuJ%Ds)@5e^(SaIQI4+g>cMzg>=_#9DTKGKKR z3mqq%wgSG$_#&V);Mn0A>mxjE9c2Ml5YFTp->fD}oYxS(-*D9$5ON>9AX6D00zY0B z833B>wfN5QbVJ}|#nvh9Onhc{ z1=}6nPG5Q2K97IPH7)1>d`uEZ_4h_P&%1ns{Zo*oA$OoI|DXxC(EhFF(EGnxbNpA? z)~sfw^}{6aB_ogqmqMZ_ZV{26BCd`euwQi^d|? zeb+@G*$=`vC0Ob7n`AleP0JIuk8KXvn9vL|t0Lt|SDmiW`=>zO9_7@Pn;k!YN^_L= zQLtyKEZ@Ex$-afI?ezA6xLfCZl2Io1PO|IE!)X+;N{LO&MC+99NOlzB6E}_;0=S%m zSK;%jb09(ikdWGjWa^2&Jg4xGDRol@la`En;%5$6MvGJGF_OBIu%=iPY6OW zjXQECeV0w>xQ41u%`ulCC}fEQf80_S$n5oxz{XB$gbeY0dy`HHjT#ficu#ifz4UUk@ z(Y?_)?x^H`-M^d`V1pXLV6)?b;<y`$BwimZU5wZg>z$VY#0IoB!|*`x4$aW+$TNCtBR zpTiY(ba1WocWM@5nQsV3830XZ$_uUuPLj$pU>^1c@OT9HNnX@*FgJK;8$fkl6`cji z{oOd7)Gak*vu~VuLyac*)5SH$d`r}%rdkR9aD!^Q$m#OyNsVE_{I2+5Ha_ioXNan) zD`o{huN{j13y?kr!24H9*a0kW6<|dV0RF-=)tWCtl>S_3xZ&8V6y+`{>x0`q2VrA% z>ENZg*AH&eZ-M#)+01bk-t)l_$tVFPQxK{@q!Iv=H1vo)@R50^7{(U`&LL(5%6V0w zgvj}ILm$lNkLVqz!4N}`RJ6=aQE7Y2-`MN&Da@Fv&@RgJXz+ zOc$2sKy*!Y6Tq14LekmNnk<`FiZ!dP>f7jSbmXd@9V ziN{8s!kKkGeUfhuq!L9qalu7?6J7U~76f^;c%*Lb`)g>Uk{U*agh5oHAHcuPPiGh6 zK(kX*47f619WC7CywR#~IR_IBjTYk-F*_^LZ)i(5X{lTjVRcD)ny>GOXH~+WFzVZo!i0LH zrYcyxT3GBM0j!QjQotz+Ztlp>bRNx4Mj|Shlc6(zCJbZipofqFBuQ@Q#n9Ta*RMp& zw6D&xFqMcaL0ID@(1a@>(JWJzAvLO+l{>*SFU>I2A8njps3>(|il5lF(|vZKCK{%> z(I6m#W|^58t*Y4i5g(h;n#3g~O=U1mz^E!GjyN@vq1q;=N1{A7HTMV8=8yUqEfCaW znbQ5yPr4hFXU=wWk(u?|L78&6(26Kf#ir6csNklf6pc6t?HMfk7iS(I zI8)0ymYl`_a1XmDB52NVob`!@Fjnq=f882@r)3$1O}c=_TIzOUC=ew8Hj5CatFjbV zUNhL_jX9i}FqE93Qgy6GJ&5hNWW6)QI}kUN=Ez@hHjOwA;-A$QAg@ok-i;N9-A6t(x{_q6jWtI^4;rLCMkfGzjn z+&a#Oxfy>h#7Pcmuu}!09i+YPbuTd75;3dUFwy7@5c|CX7w>tiOqVYxKYhOWV=X$Q z_7wrct(;64jF!-jJQup3LaB{?2(@iSV|u%fK~5H--2BDUAgCq29RA@ES_H;IQPX7U z_VWY-28E~CkA?s)8=b5hxL(FBud5ydcz?TQgA^j;oN5F3+)dQJ1Zks)D z!u1BtO?B_0QQkx*=G0WvjxwnyPWMI7bKJM|PLCVXCAvFMFSnG&p+nRO$ZU&CvggCS z+r#w!y}24r<2En$8rA#>6#_CmU~%!6#d|wCdTqAuK)=z{R52v$;UJUo=QddjurhLP z;G}4e0JX=^)nHMJ<9(AByKfNiofN(a<=Pf2z+*l_SEB_MLOLHObIF#cX5=Uf?Q`vB z1e=?1?>K3=KgV6!u(;bjs;!9;y(x0nZL1AhEZv;b5t7YGb$>WVHyVyDrZ3rJU0#1g z917a^Yy1;8E!QLbHe@&7+5m7ef&&>C6bI-n@%8(I;YRbD6HyK2SHwAk7IJ@}OLsK| z?&jQhLyZem7=CLUE_l$#;Rm)5d1!r?`V{78pp>iv->zJ&fp7*uF< zR@cuRJ9TaItmnPghd@h=RFOkglFquEw`1rmq;`T(EGt+`1x2!$l+-e8Mzq%h zD9j446kfEB8+*KjNE4_IV;TCmK03~cqZI7imbYB;t4Cg!_RbqXl4F$b@s-~C=2Xtd zi(h!}1-{^ykb9!vzCbYE!5ned)G0CtO-`T`cQnNTM%O@ndKM9crag{+b5WRt@p{Ci z%}4!A&$kMo{T4+DZ3Rk>W{$?ozjx90nF%KJ;_vuDi=MCu zsW^QC<-*GYx=+jGp$-~azZW70wcUjG;CtTjVdM?d9Y9DI$!GhCVvJJUaT|vrs!*Zn z91yP$kX<9u>?_%)D||s?BU0@ZyP}v5P$sw77JisJc)NqI3Zyce=5LMe*nD~YCYPb^ z1CEm#AK-i?%5b{F3?E4j^iZXD#J-}lvm+26*uDDNS^dl(h`oVb6N<6T5|et$E3%c#t_E2 zg*iD|`}JJ-Byrv=bNDUBef{WiDi3aXD+kZYIU^*zpAY`{tmnt^AYTkaSdG>1CcL{* zgnD56C4EmPgtB!)^`d0;9Uu8LpwXqwo~Hc|r(0XC4vOMw1YAeA zo2x0ilbNaP@vp~QJ2(L7gG^axBV}462hEYgv;K7)bbec~nSC9YQp6PVUq8V~XVz@Gz5Q5d}A>(SJNPsn0zopR+oeCZw36G4alK zTR@is!0*vPwfw^|1WYX6(i%97*iCM1;-=;E9xhuf^s3LXW2H{f5g5IwRAhX+>U3R) zW9=>M#$jNbp!v8bJ+1RAKvfXLP-DkT;@NFZ*$`9wCwcnEjn+I|8Nj=3YRvyy=Bzv(_eKfw{j~SHx8gI35u#^7o>bb z=)7gAFjNuR$!g})p4DWtZADZ#R3>#Qu>EvCt5Sa_!!C&;u7!R=bOov*iSPSs^UCZ& z@-E(a0ICV#UZuvIl^7&HcUe3%7|14qakr`;QMN&Mt`e8i6;2&&5kfIf1i%qH;1AT8EhsUrb%WI z(#pNE;xXprwi)~Gnf445W9&fI-sKBv*>x%V_{~+Z5!2Pd#EN6u=unq`{58o8_jx{M zUuH+>y4=lblKVK2VSM^bIb>O2&=WQIXRLI|O7Z$MAqROVBZ_|#Rl$`LHZ^bJ)L+GlH} zIl>c>&@DwfJGQ=eq$^4C->y89uC5m;4P536C8Y|mZ+JVHw0JF5F+CCEW%Ih ziOJQ+CqRM|hF&Di;U5;Zjw69Jyfafj!?e%mFs^nLH^(^#U}}n39^^JA2~T89^Yp7e z#*Lehndff6i8sPZe#{t9g#~+Q5edaX09TI$`!VmcU^;$(V3`TK z{Ugu`Yp5SYqCrBEa*sH!RP6}kdhQ%CqB3CLwyZ}Ii> zA>4wO1%?FWJUXO>U(0{%f)$VpzYdSzo#Gv07n)oOX80L4ZGJSxm}b=$?oZCmHnan*_L#S!lH#q#rG z$BQYQh&U1AEB@o=_VXRLmu=VkQA!VB4*wMR+JNZh5-S|bC;aORA(w+0n=vHHUOP53 zzOHr_`t|+Ep8X)|HEmE-28k@%T&8v2PBc0%V;3nJ8)qIrFeSX-fdKuS%{!nCmwPKe zbb4QSOtZq`Dss5clYXaY6dI;DkOfI_0ZD8+u3SvaJGxwVc8p#w1%eVKnF{t?%(-9F zk2S3)7~|q~yJ8eHQ$ozBt@pVn7&qb?f&?~WKV#)C4;L0Q69g*)B{D=(U@%F}>JEIu z20k!{sw61`mWUVq+-^mP0EP+VroKM!bt2y)Cb+y;m>xHLqwNIT^jI45gtGVz(Shmc zaxRqO#y!cDNsgY#N?=eWkkLw|jyZGeE544`7}STxwK7R}u_&oRSdXU7VBs3G2Elv= zqyGZp_goH(vh_%Gp##h+)J3Vi{Gj21vne+ywB99gk&D$5rVb6ysk_%fSz%oL~< z6flvX*c}2G$+~WL%MEEFVMA32O2tC%8^~2FCu4K=1aPE1O+e{r;AkXx^ZUI<4GRpd zG7Gp?bRg5UGdSpri48VzRT-S95ShUA^*Z1kX*QZW9bDTiw&~KE%-yJAD_2YdB1=#f zYosm3JpvdmbB-AafyXyAF4QG3P{O8O^#VHd1tSK%kX4Adl{N?aq7dz~aCiY$C{{V3 zxDeHaBYq@nsvTczIcKVT4xs*$z@ND|Nu8x=3oENueb<{Re0lD%3~RWQ@Jgk+J;%zx zPG1;ys}Ab&3ux-r`@ka6z~l9?kSBNhI6=GSeCM^n44rWMInr)1d8IJ~nD;O;7uyDM z2HP_0xjCvf8_b0>*1!;tp}Hv|r7t(g8caW#ISv?auctCuKYd}Q`0c?uo|!=X-Q;26 z-eFaXG>gm==#o*n%lSNpEUT`k3a3#Gcx!6x#N!*L09@miL?#MzN=*Hbc09zZ9Nw%9 zA5Zf9*WYK3c}6rGG4^t@{TzZNfOkR zmE&gx6P5$s8r$QA3E!?3O7gRwC4T`DI*CT`hwZ2nBfwymds|Ke!_%gkt2+-Hp7hsE z{D3W>5(|6=R?o1B<2V>jAUwys`O^c5FxrDemQh_W(%ib#xm3O)_DjV7-l|WyD`|E* z=c36SP_Svc*P`7H3?`HJzjwK_;VN{$dfk)bDs`K6xns+f?SQ4tj)G02e-071mCDa5 z$m&OnL6g-`57GP~r{w)uQ9OwB zNB74n>d3eVrhL$`9vQn=h-*Cp6^Nq5Rk<&MdhSV`49xVH2LIh=!3yyP%zNHHdY=GN z#Zobfs1P)@ga#YMuRB78YdtE_znmK19x~f@Pq{P6Wt{+&Jx=44xFL+KgScRqqR&O4&ijkd1`p>Oe6e0_RQDaKOj z64Oz!ZynF}e#T>>75jD+z#s)yeUZItu5WH_!sj5Acd^#0s(ZN}d?8PR!QV^lj1%*Q zjg+>VQ*rgNUp5bMCSLkntr5bT&ML66)-y~4A4Bm2f9Z3SQcrfvPOh$Hu2{-*LcZa* z(y+iE#G4Ke{5tNDKGbyQQ`P#ZuB08NeaRaC;#K4o^USRs+1Vhx(F*-FiAjw99{g52 z@Vi%%{Nqb%9;o9HZ-t27ejxcMcg8nLhpg9Y3^Bj%lGk3zG`HB@+Fn}8g>Rk>Ek{s` zJ9LjajZ8y`EPN5X*A9qOpv)3~3R@y5O@OMD*pr}0Ned}5k#yMl@$lk6_pQutskq-S zSY8xsXJKQtb$QD%x7b`Hi;Cwai+m2{K1YBW>zh|+k0;wx>v(!5|yo1MvGA?h6vRiu&lr-;+%6NIS9^U8S%9elpZASf2i;g0!D2qhifunqiy`n3g_Ni5cHn{Ub5XtwnW0d3>MEP;?4M#8y@$F4z zb|{q0W~jD7&4+jysMm*G*a;Cd4a-5i>mzp?Gk4o->syp#D32%~U6M&$MfHd(3r7L@ z%sK{TwZ#BItn6e`npp=osuoIy8|lx*$x<0jUdE{vV-xAaH>{#v2WrJj-sfYIrrFZU z9bw^E%kTO7$(vWz+kY_Dhr)wNd5~}=u=aVGOkXrG>Pg?#ac<6ScURXIIb~tl?kyzu zT+geMJ}(5ujPxK+6SrH*8It{VJ%- zE(}e*sFDUTBS+g zi+xw)%)*r3O#(e9qA|gy)wRQo>=V@8({t~R^g_m=$EjW=mV!hOC*K!*IR2u9os=1@ zh9>L3prjr30M9?%OGKk7U(U_*Sc6+k(Zr6g)~Q`qhi#5Kc7 zTgfcpri}Hl7r-?mW;VhwSf-NOX#e(l@ZDu35SLj(TK30iuVufm3MOo~ESFI(hWocO%gH{eaOWT?X9FCRT} z$O%plq@D%H@_d0J6C~J{)j)?8`x_-IYu(~hWBNXCYP-@{#3Iq&LtWc;55#evEH@!l z@ruDFc~qozQZ6=vk&=CBz-5QjcGWtj;d{};l%KS245f?&Crcg+-)9)x}+?_O8dx_3go~ew<0*&J58~^8f`C%&o7gql$r#1i* z`v5}`4AcXGE+E2OAoh3oiX}0|m&zqF#!4ULSdHsL_dpvEIo|NsyP;DK&oHxzHQFk! z(9+9`*#q_MhDLVX)(>jgrD?b9;YK}q`(u{o&^Q0whmTqL@LVHO-+=Zvl8XD1u9;*O zR$^~>Jiw})0^y%kJaj=}DOsIUFbdM@i9`Y_GJWePvVXTqa?c=un5+2BOLM2!SJ{1f zw;r=#^DNOtx^`6IO5&jE?p%LC0%Er}P}1{y=lyt? z`6=neC>3aIwTW=8k?C9~psy0rEpS;A8g~hgBe3{DNA#}#aGIifU+kc{v4m})SO|+ejyQ7&TF&}C7w2V*SDseG~bE&b1b7K!`b>*bm zwXfqrP+4@n_jIrpkwYHeUS(>a-Xv}toZfC1-`2@@ zl$Enm5)>$EzPM%X{k}Cnp@{=9ol75r0(?u?~KPo0BZ6I1Y zYCzEHtJV(m_aZsUdP`{N1TI9X$0t3Ll(|MvoD^CA_(T&I6a!^UEN@ndu1YMD)Ka-h zejuFGi)pi;iaa6kyuG&JWeKDybyJa`dJgoAi-e ztNDr-400*^o*FSE4S+5Oh0j&NdYJUomGp#__eoX#Obw`J#yCAxm**a=>WbaT4O~H5 z#N;6jLfVqMiBgPtwsp%~7;^G73ja4=btJdb9!KSx= zMLk#HZPb*}?W>MiZXD{bHC0oS+#xvW^mS@o5!hZ+X!+>ifIW3ekMsHM(u-9+i08C= zxGChoRUVZUV^Za1<;aeKBxA5BB(=*f`{9@r zmtKe-FFt>Gtz*vhTa#l!HK#_G)#Y_1Zry2Wj5@=5d?7Y5x1zM#{3tH!uTCVZ`Xrg{eOWeHtXCa; zcvjgK=Vv}U*H1vhUJhMb+{hix z)b?m=cBk(FT3#Ejjp)W!_T2ri@%PiL;TlV4;Ofy#xupNz8es_miixi(aQn9=SL&Iy z-MhLUR~_TAV7PGOc2Cs)XAE3j#5;23r>_vq@Ney8-v1xHh5u?LT>o6>BR`{je>qN@ zy5YkkN299S_ha`#mZ>Ky3V|bH;Uh}^wsdiIONf#+J)EMhQ*W+rmelgnuqp=2(MO>v zAQjduey)1yv8uGW_GxWtZhh%aU-yz>m9l;pLu zuniaQWgisx>S3Q~%XcX@cK;B7S-&+HtG#1WS|;gYQP5Is$UnPmFbPlyDf<9 z7Fr+A_5d#6XYv$q>w1uk*lFZJM{FZD1HFZaX~59z)GL@rX9MmYwP=NOG&!r(#nBoEXHmQa@pc6}{yG(K3R_B0o<$sFjpQn78@wrwXB+g8QKjBVStZM$OIsNiO;b02Qo=j`3u z-tF9n`SicdF?t_gALGN?c1#s)S#TvggsAwr{viGC?-nsEMWHI%P%{Z8YOPsk&IU0C zlss7$rSLkeb~@!IN_`!M*M2~kW;&_MlIY;MnsxH>9X7CB%H!p2fp;JUF>vpaVMDxUul#jc;enq9~mX<3#k-upsbbO7-?(;p7- zd%PK$%uLUc9tk88rR}g!o~5zHI6j->QRR(eE`u(~Nap#CM%cknbB4h~^0pFX>CH4_ zr0|n~7q?+mV<6b&-lDjSWq6D>%=Kfpi^!oOLhtq>yC&^0wVUw3Vob7J2h^l(j3M{Ms!f+!}v`}C}3iQpva{t zFfL-QBOo7~F*XXClO=aY;r6`&=Mn#k6`;yuhL)gI@tjD^hw?)aE0XZTi6^*b+|=gg zqTtp1ee&sguC`FSIk96IajM&?y*ko(b)kV_@M~YN4L(xr)`#xwiIc#naj4LgMvl&8 z4Gfc&7)A?Anaw;&^e{QMFYcO!vWY7SXmESQQS$d_Y+%vX-a)qXwf%M>T5-1g5mqp;q?jSr>`trpT*pb3bOC zXo%hvduq>>ky|@Yz%)qYMn-Qy)6mSV!@~6(YeQ3K)F+Au3ycv7`m(+HUQw2ezepW# zaeWv7CG}(IkH0B>IKIwwKm+OqYmNwn|2i_&@uqqht8TmqN>-9^BQ^03(s5=3J&Fa} zuBZcjR?cY~Yx$N+RdvuU9w)H^RX#{&-F3vb#C;5?%E)176$WC0af9#_$_P$w8D65I z8&gg{O-da;*Z~FLqwYRGHAFFJCuu?dFFyxhIckzH$z626 zCZf^MIQAxDE%Mnl;#vHfipT=_o*}p7shQK3(Os#{m7@J9s@-1&={MQlk}bz{Su3!9 zz9!CveVs~ZR=NJF7?^oh{5NH_HG(5us)zfzOWba*_R?hSjOq zNJg|KiSGvu6PK-6_P%Lf3k(7jEnr>Smb#X35KX#G8a+o95vvI$rzFu8)EcF}!_ojq z64v@$Q+Z{YUpO0RKUw9yZ2h8&dQ`dG*!A3CR5aFLm;2hp9f%7ag0m);+f5CtyxG`O zSDa(#rRFV~<_i<3>@3{5D4-}*i%Zp~3=ij^lzNQIOJP&XL~aRHaI&q(i`I&f%BQka zT{sWfaq=o|rpBvTxCx?nJ_cP{!tF@7X{?*~4KI~*fjVKve|c42!-zW*nq(an84RNi ztF*xA-(>N)CkCjEzzdyZRa@#@4Lv&JWGd%L|5l-NMigs@8V!adgtAq<2bFk?bMUSn z`6Mx>K0uZ^n%WV59z8fGnvEkFeyChX|4FTea$~@;tEz(Qzlr2snHlKnr$~3E#a`KP zp!Dp}J{p*hR;dDGO`gjoC97J-I-+Xe-pZW`L53NzEaxC0uF&xITD=|2W-_T}Cr7CO zO|n@Y;b{TnXSn15OqP^#Ny1Rxvp77P$zOu}+?NfH*i>Zc!e~Y8q!ZTi-YChKSCt>8 z%I430NgBZs`ig+;q;U7cjrvt#a<7ehIYC$)_3pak=L8zG+cdDBduui634Zc}mw#)C zC_Her2pC{b3dz^Q8!ER6RprfJpxkuUj730M{>&EF&&;M359Mj51h_i?N?Cc%m8+M` zd>Phh-mC~Zs!<(+oo7h$1oh0GwUS{H4QHB7QgIKse7(heQ)CDfnJ;rx)ncN zBbK9yuG|G_2!M?}W%`CbTha|(lsE8nGO*JGbnb(>llJkfu4a5ClEz%yme^u?(4F?k zAJXt+Kw>gKr~I0Bf;Vt&GGu#;+n@iAe*cxCKZP^04MEy7RPUIOBm6bbm&xH%xe%Rd<1#B(9ezRj63^0{im3HW6oa|Lmer00Zp^8RmF^2TgR3Q>eJ7hn+5wB>D=*LDyHJ2Kp1Uha_g0hkRMRKxE4;+%32Ik_*)*a3AE9}K(AsLh|G659mh zDr0X&soacugW9EI77fGIWB{WE$1{OS9 z2fZVto)RbaP8c^xh&pC)YScRl@a>~Mj|a8!b^0dth}WmM)?(#|X@g7#O>I?T!{MtW zYHtB{njF2$+~j}I@Ad#Gizi?y+E81}Svw=K}?cCuw50^O7g z-LI%qU4Ba#_fp;Q*SbIlsqu7HZdD6f@kaeqp(&&~`}st{9;Jjc?;Jml`8NB#K5rBl zpNIQ*Ym(h(UpvQfTxGQjOLy$W#6M{vgBz%?-IEwG^jfg_X_#U>%qor15{NSQvCkOR ztkLWa9>UWE851iof=+!k?DlIJKtqhwm~?h7bGaAyn*v5OM1*Q_*s6M{s*4MXFu#C# z79Mvb?v=QFr-kw#1-%f^GH1Wx{2aoM+6u1T4F_x72jj%Wk8caN`ovn${R)KT(EMy< z$L-E_ft$Q@18pnGeP1-|!vH-Rdu7zVY_RRs;t}%Zy8c_|YBcYHD)%K`CMEe-7@qAv z!SMe8-V@_S|B@~Te=?q;FSlH^;OC)*Y>QkYv-oc#4jl`~@kn53a`NaGiDBbS2Ec6# zg|UD}hWNUfwRwD8Ri{;*{w-ZLu5eesui4jM?fq!!p+DdPR7vFNtkh<+Q;?V*SGe#6>`iXml)+syuf2;kQJX zkClqvv3=R*ZLdO7@zlJavSC2B@8Z*G!T#Cnv9z=I)|Qy#pi-#@BDh+2*FRyO!kV61 zy`D+C_7F6;z2$z(iy+yF$+pA9hOM7(yQ+H!8S+WnphSxOzP0!Zxt&-DHzsj99UO{? z{LnC2X$Q#g)?K>~NLo+v@dt<8s4k*W8bg4_#K8_xC_^+DOc*=Sv)+e?BoR95qRZ;*!U))8+H65wj1+1fz$B~hIKWZ^_*q}PB*`hCXiaRx zA0Z2RhElp9_dVOy>e8on<=@K19!=Nzal!l&FMr=!FE;R&wBQ5_B*ZjhDJJ-LzMU$1 zBm+=DNGXBkhGg0SWqzJ5w%b6eU`?d7cw#Kq-pd?>Y_s}MRif}f!-_85x1i&c-@E@W}H85q_3U#e85QR`Do zIRn6`AMGuEWwf3`F>+hhk&T!?!@jRmsME5zv4S#(M6@KFCeJ-EO7+ZOa;1yJ7LsiA z2BAs)SETIWYElc@*M>y?;v@WX+4#SGU-18I%7564nXyt*{eSuIt*;eTs+^_c4nWN1 z_oi=Ctb~GDN=0_MjTusF&B;ix26?f-d4J@gv4pY(PvLD6r>FoOhWb1W28Q?{rfBQE`m)3Q6sj!^` zJ#jz=63o#_@5O_)U;ZLRRdS>RlY0}VjhHgCI(K~T>x@H1*TouuKk;ERhsv%{Jl(r$ zbh?k8?ZByNL_>R93gzR}o`WrGx9+efTRsO2pw?82UF7?)<#Dw2a~%Pmyf#6hf)VDo zR7vjCmn`qc(iyfbB5O@pWuKR5*i4^G?M2R*aKNS|HA(~D-zNLQzK&)*Uu{J8U$zmU zf47Y&IXN4s>RUM*{}YQmb#pZ&HFR%UC~ZVh5xZs8g@zxL1y$++V}z6_0zc&QD_z9F zv9V3&Bm@gBF1o5+8vm4Smaq6H7@i${M0uZby#L_&btN50O->ND^*y6?y?xWQ`|ah* zwi`q}gaIuBvdtb{jJ=El*U69s7cn~@dwA@c-UyJz7zlqT&+f4qGegEZER`Ex`_oId zMFBj@Fb4*lkd_;GK8V}^+a4eW_A0>^e4T<-Y}W>3dfkErZNC&H$*u4`Iz5n`lGr_N zj{;zdE~&K+k{NX|NdrS7Q--T54PL6Uj8d-=pRYhNR+BHIX3&+Dn=*$47ZT!i$}g-0 zj?6RWg87#_ACfK$*M@8l4>n7rowr= zi1L{vh11!cAHfs@=H&N7S=CSz6LpGU*3zj>9{@*9g09MUt$4h)MIr%P*PgyzF6<)q zp{6L1D}=B?=cH0LPhTUA{d|0*a{4Cg<3g}`H)W6GwvJT@HiF8bgP-jrK_)JAPlN$4 zdP!!U9X8gA-EbaGZe8D#Wmi`v6 zrMTb}u&LmNR!$*B1&i@XEegXA06S!C^6Ln$k;cz2^DCr-;KN#$tVHOoned`}jrOJ| zkGTusCKox(fZRfSQKF+zOnWBbk2VH05Jc~ZIXWR7z>rZ&a#_+8Xs?rB9V64AUk1Hk zk@za6&c+xce*fbewlAZE1#I3z%!rUFw0@751H_+le821v$j{=)^)$v)wTSNuns{@F zD%P^!14Cnc;=&aoaPdYKQ`jtQf@O*c^eor9g^*B>0VnlCBu zc#YR>i3-wX4p=B)&VjK&_?)wrzBAf9ygZF$2Yf-o4ep9*L3ywgx-v~qhlN58<^3dB z*N~|yub~98;0}?uC&Yh9Y@q{X!jLCwz|yQIGy>JqVCtqeP|gmprv#O~^Q8(UcDp8N zY+DV&JRx>6$gU`lZ7~sZt7m{`*!4*1Gjz~QCSrm5xnl`{Mx@=v0$dF|6AjBDdJmE0 z=8x|(Q5$uIY|ygovRBb#w@(W6-#`mF0>$wRSHql{W=Ub3-i?N16Twu1IWh(B#+V!@ zfE*S!>@~$JWv%Q_nr#+)WEW^EZXYOT91{pr*8Tk9)hxKIDg>j|c~XdzW-z93rr+j0gqslX%$2CiQ8if6 z)+=u`W7zen`pXz`U3WGKvTFW;n{BdV|3nR=&Ed{TPRzDFmkbqnsD7MYB(MF(pH2<} ze^?x3H9eKw0k9T%A8QOi);E*E_?S|>OPzoYRNFRrIt(rrzma{)E=@O#7?97dDo@RI zMQ$-t>YMK5WvWOOkTF?_v!pOC$xO|sKc|&rF7hKngbpl$4nc;?7qO)V z)AHDfrV=#a*&Z$+D(9FJJK0P`W!N9t)Z4#0hz_V5L1d|_y|49^GQ7HL?o zNJt-NN$cp#%&c*VFB|6``g+kaDJpOOmS%>76>7G2)xR{qlct4EpeR@scu1jlo@6Ca zxGz@Ffa>CCpC>Bfl;|-Xqz_A1pGUvoo~4O=plA#hr5EFR{BV2i1ny#l=UXh_FO(r-ia@w%cC1Nw|;!IjRKnZ#CbM-TJnL$6OaYC5XYd09e z%c#_MIz*|4=~Y3ie08#}QJM$4fa=A&0idlmZNBJmJ2seb@lBadLG2?%XE)SMi7hoa z(}oaHKZwPNF4%TRnCCrEvP99M5*za4KWPRCVdl{LwA|t!y9-yJWYJ`2&mmeqK>kAI z*g69Ai{RhBEu;S{0L1+tAE*Bf{!B}L!JnaS>&n{3rB^hMm@@Hba5`P#8jC>x#ke6| zZtJ*QD+xA|RpeU>T(56 zS425dLq_SW>gCMPa0ri=Nc1w;Hk;-vHvpAg<>-pH&Bzz>XzDMHIgEWTA#N$S<@Y_zS})sp!*aEcPv7~C?pyN_X3+RkZ9N}(B4ci2-i^=nd^ zJnhMCS`pCyW>9KuDyu3*6<>#&qomy@;8MB-OZr4BR)Tc8&a{CC7C8>W%Ef!cXNSU= z1)uBvd$wfX^x6K){ptPd_s?PczwN}J^!LB>f9;?CnlPnp4fVg=o`^+l9VGttezG>U zaWXdg>(f7M^hOoSzh+LJ`6QcmYX1WgIFv>UXh|UVwQv#YA_)+@aAIM@I%_fQx=ib) zcH%b_pCDg^{MqYOJmZdfs|M~ob3@m7_w!E2!wtu)ski5s11?|l3Sk66$wA~IlzWO4 zh1}g(D-)s_WyUGVXb!Nu@2Kd6FAuwiW3Lvny@*23sRWc8CNsB!cAkq1XU@8&#~T~f zH~uP1I1!PZmPwgt&ciO{+Uy;KQ83lt{kcl#y85MT3hS~N%UI&2AT}AOV<{0FB+>eA zk3^b>E}l=kZ@{0QNw&?wNxB*p-BPI-J8Z5*cX&3Pj3;anM;|YdH5(}lv|M}Py*4Y8 zS~^RUrC;;hkXe5-s)zMebrly&>zo&a1FSp92L2s~ybS`GfDr z(EIF?Fu-Yd(&TJrEsin;JVYag05dqtqy>6{n8@kNG>*|!F;L#UrMr=g{eK2pA*nia zo1)Ut07A@4ac6gYc=Ix^!|#=};xE%t=pK>KL41qcl4>%|5{e;;mjcvHm_YA6sdXo& z+lE5G4tAN4vC{*etz;e z@_wz$KdPW_uqk@6Lnlp#CghS~OZwgx3_k)piVVclU&nbocE*qVj*fqZKWU>xhxY(~ zjs#2w>79eo&tlO(H}pE{1KHp8Ne%q_I}0l2XCweAu)t?K@)I(uQHd^cx6QOzGuLIN z-67!qOBOJ2%+Lqnqfw_H{eVbHZ=cnZ5<>4{@qn;@%!`O?@l7I9 z39C0Sgkly|oc<-!OT>(;2s9djLy-AC%A{9_Gc39X*841P&Y(u$31Kxy?h**sAn9tusS?J#5)9F`d^82z}`{(ti{hxKG|GEC; z^&RxBjh&1g{>S3`uM3}G+DsP>+Ps`lSE_~$N;d%-!cdV}aG7x7ee*RyixHPr^H=F1 zzk_szlj`Q*eAOOzedXBTm#u61`9#KL9V^b8{#9jnj=q6JOPE6*m)@q)CF60NfgITX%*4`n+E zvk76a4vNfNdDJtl5zRJYkZt&ai`*^7bh6 zUga4ZE441smW*eMFIpPj*+bZT4&~5hWerB?Xv-+kjEm%+z-FA4*~mIuD?|6_0WnR{s-|WOe0MA>S`A(z z`zV#@fH}4@XRDa=KlT+iJ_t0qA*nueAoU0^qs>8D6pCC5To) zQ?(&M;1)AZ{T`@A7*VH!83dOyo-s)@Kp7%~B%IquXW))MK@AJJaNQy9eyl}KH-vYH zYJL1zS)$vukPw@ZT@*e&o@d7c?6Jeo+2kP2ALm_|7i+jK5K3^t&Ut)eLXRBs`5R~a zNJ;r%1Nrui=u4CN&nsE!f3uSRhXSrtJ99-6LH?9Ub4hoiAn6b>uRxJfgoJYkx5O)e zCoi0X$Gq+(O)UyY->iw2y!QKkn!O!+^%@43n17%=rO@pT@JSfvYPXy(I%eSE;8;y< z<$C(P^*))&RqylhFkbx)u$xZ)xUCGzkOA0+nR>*Jazy9|LIATBqYr1Gz(|gU0y{!6 z$~*2YwUHis^!L(Eh_*sj&{nkLkSr?lh#5dBW!j7?-%L@s2KZaTXk~gtWgoeWBC?33 zfcM8z1aOraZ0?9OYgZMIMI}>ka3pF~$C?~-lELgm(qrRUsJ!T95pe4#aR{U$f@iyw zi`X1A^1#PPDx2PF*ul7?puP}UX| zR>*0|sS+_8nNckd*E!_MECRFtw`J8%DCIP?mON=xC8G4IQ^3kNI&_)>VI`8x?})0I z@zRL2PJATi33AiRwltgRV;d3l06$I5!SNKO8^lKn@{*P?t?$28Zg79AeJ$M&kzh9^ zb!VaSa7D^u4V24~6y$_`XbOZL*);DE- z0_-he7X~MoQN`7DJ!0E%MwNbTebW9K>$01^@_+^;*yi9^mxw`2Ww}sb1JkV;%y`u7 z3}Pu9rJrp2a?hVw|shuVKApE=0}RCBG9>aoVwAJHUj8|hL^ z_K@YGYfPyXPyp)p^&zS<2#+bo=FXg)jhazd349?-wDmu^ONu_FcqG^+pV$t3rmkG1 ze-6|bn(Yav)!vCfk}ndaW!5sUH$r~Y=E`I+bs|@)8FY*Xw3eu60YCxB$xR zyN@1Kilc4MgdAt`C;ns390vdHYqpD_PWZwk$TvqG=EgXOnDD(_FrsPCRVxSY1TbH0Nz^0R)qe#{#-uB6n z7j$$?!5x6PUKja$fU$`-{|ck&{SmtsSbw9d;kzv#vVU^GSXF-XL2dLVKVN#kf@%+P z`$4bDFMNSx7%1%T{JexQ$he}2d<4uL{x~pHD;R|AVU6T263EN}z5^~wJ}rLY;mK(u zlmtU#?EQy4SN2=|lo~|r=dmQ76xakZq)L98VdOHQ#I2>mw-8Rj*~Fjxro%{i+k3?C z-A~~Aj9+0PxH)ooQVP#urmvQ-RFUVu_6H?e5eHVU+<}_nbElJUN~(Q&qmRnhyG$U! zPu!D6uzRR=u{Nbv8GV=Am0#T?3|pxD*r3kc@8yb?9!Zk#Ug!YL?r)aJ(J??_g({0(fl*o^Oc-#RQEgtm zf!`!e0PAEZt>0wD8rF9q@JpH}z6=|$LSLrV$n(8+akE@`ne5s#VT1YOJz}nx4~RhA z;|ja4zaIZt!&~HIoKoh^Y(v=hW;oXf#Fm%Bl)tX8Wqp!GsvYGZav?jhYWd(>MKO8b z$S^vCE3E3Rsr@pqaH1!AG`!aF`ZS3OA*&y4$H~C8V?&v!61*ktmW8=BQUI@8B>LvF zg8T?Y79Rzb%j&HYco78d*sKM)FCM-LM6 zKzj(O4yAktbhzSGgum)dm;Ci>&efzWfM>;qbcZkA>(I6Pi{9$l&HX&V^8}QEKx$3?J3 z(4P>RMn0TqxRA!&f-2b3;6ioHKFBAeff@sJC{t`1G8LwT!Fhh)JRYue56$K$i4-IT z%>|yc+@bscNyWsO3@B7>r&hF+M`B|Spi%bN70upoI__`dD4->Z$~wyttN*$}7% zJ7q4C8%0T&bvbC-${(pbG-V`K6t&oR#Ip{CGg30wWrbafLS9ws#ZH#ZMOVn%9>tH# zthdU~)%w~DU;^`#N-;owIL`}W>dBmThLlLS90Ij7S|QelfYS9Eh} zM1|d-c7=VAVuxWmG)iMnEvFuvp-)Z~%Jf1@Gcdy0UjRL4(K2cyK6D8Pszan3cN#9p zD+hVBT5=G2@i6$zk`E4C!uaBsic!Y08XA?KZIZ`KX*GF~SUHtSLqR(X&h34hAS%#Y4u_<=Pl zAZR-4=VavgO5f_62qS=yXa{(CV%)5khmmlFK!0-~7ZN-E25f`Ot~+wijeqFNq9w2p zX)Ns6s>CBfwzLw$z=F~9CNncT!CK0)O-2qBhp{V=PD&j|T8R~}0eo>=6-&zw_*cva zGEoUef|JD!{;&@30}95^!DaN3Wn=A7Q4F$ce1SC00aQ2fA+~E7zYt?DtmqN;u&e6{ zS7Wc}mvY-C3aBy&>cvoqQB9Q1B7%~FA+tu?$VmaetMO+bslzYfWKZ;0G_V|ru<69C zkc?;_I<8~^M=H+M7Y$9c3^Oa!KCwfTrT$ry>@|J>U%wo>Jsh1vih+7^)XwB6()bM~ zdW=12SY0f-o}L!|nM3NOA@b+08giW?szM&D{IA!*$e(+zjNZ|F;_4hhEkt|K=cqFC z0AA%E`$HIhd=e|~*dfqk&^laBW{R6s*QRBXrrY6Y&*Q0mLbF=R+tpyK?2S|k+Y*$G zCKDRO6X7RN0rzeA#a?HpTjfK~9$ei`ISW*(#aO61jlepf$nTMU>Ey zu)`njeH~G^)sCdyiSTz<*q1UKt_wsaf}M`i@@Vak zxl}3XjD_eF>?;w|svZoG>1k8WO(n!BnhRFhg2%Nm4Xp0(*;!S_Ev3YpJU1Dm^+Pra zb-^oLu!A#k<~sIP6%5&vw{VWyG_gXc58#M2@jQq1^>;&)gAL5a-B2+`S_>&vDHhz8 z^a&rqQo$hxi|64R7ee7ESjv-jma5!1s{{gBgL0Ghe%tOLR?20}INeRfm#g7_+yvXcu@qcX2SzPVLMR}~C+b-n`*BIW}c}MxOE<2_&b=Bvh zZCWN;5!kYR^ns%~L4$vwN{-Asl@HqkPF|^KSoh>Kt3uL&O;KUqflnLJ|!IMF#VbZ2jZAd}IHYJQ+402hNWpM6Ap{^>^ zAIM~z@{~kRw%#3{c0lhunw$OsxvmpvW0t46vO9X?EKv;bF8L{ANwS^9FTDeWm}}Kq zbX8OMq!JxR(B9XcwLIuMxTtYc1_cOiX+=(fcd=UF;t@IA{sT9!jd0Z%+aJ9-u}Mtv zHMvG7-QSBgi|lwC)eLFv@oTa=>_Hw_RY%nWv}WX0WE6Qq$s2jtBgacF29NAGF4lt( z?q{F5=Y-HPc_RISDW5~Yq(PX}* z0rVK`d&@SlwRQ0hY6x>!yzh7s4LfL>-K-lAvDQ-il5Ux%c!zS&mS3_izu>P!*K00# z)1jiK_>lqGz`(-HaSqd|_Y92Bo8{_m5b|wHoV}KcowAI(eD-Mn;8X?e{)*scr;aFB z;zOMuS0^(JWNach3=@`aKl`172Rbg+c7XeZmpaC;ZZi5eGqp+XtzC=Nvo?%ElRMJ% z(AlijHX=_|c5JW9gkp}Qr+24FpR8MLLH2g4aOfiwH}Usv%K77fVzv56?aN5uA5|!@1QOH#Gt6Rm;EC@`A6Kc&M3z2!-l)JfG4nv#RyO zq*u2;0FW#RkcJ)|OLNE5=eYVT2L=eK-V>>wte9wWJ*S<V-Bm-2K3NShsPx(*ZQd51Po)5d6)hIj7W(%*s^ntrmquokq6jVgBT zigb}ISz$2g*mqE_!#*UdEIV}gu1&Q;x^|}dF{`pvFx;aJ=l^LkbnGtO@X%rngmDHP zY#TIh)wnHjevU=);O%eaRR_V_4)%-IV?=I(h{_Lk24S<0*tvI6W9n4tq^gLiY5w6A zDF>r$7qFuoqPKd7-KztF^}Ntiw16Kqjh+V&37xR*S0w${vvk6^tIHnY{ zi2@F`EjPGT{JV&I^#Ozo)#@Cz6sSN^%(Ufm+>TLd!+Y@Mprcu{-WrWW?*;gU+< zfu{SiwFw=Tdu{9;Yb(;|&{B0Kc9J1qB`l0TqHOpCtRq0+PGp9ifyrT#Sw7-3?30JK zp_{2)UIz@KS@^OoNOCcuI}{DW;)u+P{-@R@AMp90ERRBX`sb#*Y#s;7V_x2AXpl0GBu;Utw=XaDhHD}$3` zj~uoUwJcQU#AA6;g`kR;$EM;rA7W-JX!O^{y zv1&^9@e0v{%sPiIkYp$ry)1f7TjjWc?iZzv*`G3Z?uE&)v7d67qAxztIu><^F=Z+R zH%O%KDR{ARKyJ4vo6Fuc2>Yk1f?Xnr8 z-%!#gUNV9bdqxFbUXlQl#DfqVm!u{sDe6*)F)Ep_X}xAsc{!S<9E;FQRaLeoNYTwh z$9Bp%a$hpB4-GTwvCU^w^#U}EhCEgT>0&g%AVo#;Q&|g_XZn&sH8B^d#W|nDVyUoG zB0CYberBuHV48WJvCUPkIjV{u^=G`!BV)A}O=LF#O~bZ4LkV}^i?6q1dW-_7#FW9(5Q#( zT?Q-1ma@#a?O9a*MG|K`oA8Va2$82rMTLjKUfU945!Fy+w*jR6g=}N$DZ_a|B-Bh9 zCk;a+TTcb@*i@*hwI(~3UWU0PA~YK&>YU!Dd(TPwJ1rjUk}xm%LJ@|U`Y)i{gZ3f0 zPBV>+;!oL>$K&L#%GAfa`|OM`OfTAiJ=}gRk=sWg9h1e|s+mj&mUgt+&7CC}-g8vx zw*GUKd|M*P-$~b)ZCDRyKp~4O)8!x$dXe!&^8x3E+kP;=t`HQ|+9OP8tsRQ`TeaN9 z$%0@s5|{MNsL;m%wyw9on34_cKI2VVIxA~u@y;Of!u4+<57A8^_)!0hIj}D{dJWgO zS2+g;Dc#G&fL;^HV!6wZ*@GXM zMebQ^<5P5gs@bK1F!>O<_}s2N@G;yY-=Gf#XA>gyccXuRWVDRFZ;*+tSx zi~8h5GCj#8@gy>`v?39C$u%ViyL-mIB38Wbe<%5!&+wJEKp5n&%a=JovoR=0_<;CV zPbdQ7fJpr638i1ciGO}KB>KOAJpQpGsB5WVsUUyIBBn^B0L##6YL;6oL6=(l>Q?+9 zBnV7nB~AgQt_+VK{U#Kj%ASg^T$#MoPWu_wRFh z`+<NHKvB8uWttvm?RWC}5Yk=iVR9Hf%c%J=W22rAVnOGH$f z&j)ieijIWps<2?QOB0ltI_q4@~*b&lk<%+9h8P2Qi ztv$Ho0Fi@rwNAkTkkX=vNDLm~x?2b#X#0Xe5KK#(^+di|C9%aTPQ)X_MujO#lNA|M zGg!S#32FLY@uCys&<-W|XZ5*}#ul$uEv95ne~^L+(MXMz_9$^Wadl|RylgUMZ@u~F zSuA6AH+u@)rim+?4w=INZ26O?bt(){qnndt199fmv{9HvzHpG_RO$6)B)&$2fdoh8 zZJ(FF@kJ^M<1okOZi(84tU*VNsw+&5iaOd=cX7e>t2%_o~Y) zIdI6SZeFee;!>Pb75Kw(Oz9ZRwCk&A2iW*s{1}-IzG`UR0h_s20R~lR6brC(!sHDX$FiCh1vp7GV0vjPs<2o8IaHDo&RJ$Z?A5ejUM1cK)j>_r6Jo=g zF~|YM(?J74qFmGS<$DW49C%I8xO}k-`bv!5`y~cEO}2|9da%Wj=*bIAe-`fNN?!>cYuzPFtR^V1zV%WdGY5 z{gDD(q_2WJNgpsy>dY#|a{Pqr$2o4-lJ@4=ZR7ZIEnl_+{VfLZPN|_hy zQ6P9;OG^L^W33oLg<_;At(p|!!pH0`alJHs_-rtuu5hB%gj{vAu$EG4gy!uv0qvRx zz^(zEQ$*orfC zIvnAz3b!OWfa@Y#@`YcrZ82!N^Bx!i+XobO9jrWUV)uoPo%g5vjJqFR2Dd@n@Pzhn zt2keHF$>F(U+ssoikC$8DE_q1%kc3-W^p^=b$McaX>fkKoTz9W`VR*z(~C2yd_>9G z$PO@2i{xaH)npCT^p=H!jAsXrc9oTpi<*J?gzF<;$|59R7lC+>gvFU+Tsq$njJgp? zs1c2hM-i{SrbM*(Lj(4I8nO6z9wDq1y~X|Eb*apGN8l`a%gp+-(h2M{eg$8=F>W?3 zjgZAx?~nSK1+nr6{ttQ;==&eM?bZ;t-$BFd*YG-#$Gs>m{vSd=$kb;(1^c1cqRZEt z?#WjnH~MJbggKhTlRl(TKmD8S(C%77*44f1646G|L5D)6mO3R?%@!}PixV@7ZV+e3 zw?CCu0?@=dj<@wO5oZr)0$Tj`Ds{Dmq4e`W=x;b@33%lgl5+LJmV5wL*CORlKmR%p zWS?%b(9plm9KS&-SvXN ztiWh*QqMw{V!;z(Dsck48!3GgRvD=|#57pZlggJqC6`&h0(1x|zc5!-Ek}_Whn&$S z-?Ai@HC>0z%9YR}o{^_!T@O=@66NW_V~wEm1#3skul1HrIEZ(QnGv}CGr-N^>bd07 zlg#s@mW&>$Nx9-gsKf}_o0KMoB58`TB6ORJxIpMEIV#kG^JAeA2$C9{q5hPazP3t& zX5C1f3>bQF?xi=VBf*APW&EOan1t+9TO>_6zULNxq`mS9b+H!Z%_cFUY{=LO=KHG!3wZ$>rmzq+ZjoQ=Bqu{DxN=h8-dMkdR{zw!a66UO1-X45N!>W?~PyXO~F-S3W0egkK`T z7elN8^k41Ae_yuq7en*!@Xh~XiT%UYywLm#TUkW;uxa8-b%)Yl!4ytilNVGMCHE&r zU|KaYiu;B{C}91{cqfSK?r!VF6ac!eC}1(zwxFri@Q2X)0yvjMxJ;0n~4u$gji*gPlJENg>)RL3?>_-N)WNL6E%U z;UOHn)T+N0!VcJXdPvEfVIyMWWnp#`^ezoyy*9$;(H-=0rtDxMUJ(HGuwH$BVjQ@8 z?8DpF&EV_5Du2kph&=o)2^y_F3t!C{oh?B$ZlTPfVz7PUmp%c6^n>U&^5s#yhvUW@ zmgRc3n;4GfT50INf_`@Wa|$A(v+mMxacV^Va26#QT}HK| zSB8VvwW^a{8mx$p-bh(B@OyL5*|!PUO(E(DzZ^YyUh?I>P38Gi@e&egYZ-(Dl_`Nf;bK! z#7dUmTa_sn4$Y!O8=OUzAq46eD^yqUooN+UH{gavWmlyd430`*f9Z}!iYTX~ur+hW z-@{X+xMKFJRGe9wQuX!0z2B%f&0H(gNIH=r7J1sRBhrN_x)r4pE)@*4jCd+2b{>KJ zeBBeNhGuKNiIX)HL@ynZn@*bKYB5ZHu`TiF_iNx|_vVQu+N}`9u(MGv{2-xvZrp?G ztm`Chhmn=c!bCAVOB@g@09-3-@H&gMOQP8w8Hz|BsRZmAt;?AAQ1?b zCZ7u=J-k+g^Czq~eb?I45O5QwN~;^jY@F4KwIHi|*f5iZeP|qM!wj=r(hQc-U__VR zl)TR{95OabLxG21$rIgxLHJlc0)||}t3MyCVGy&UpO8}(^z_%G6w>GozD&%Zx8Rgo z^%oa62J+XxoA@RoTK{19CuN*;79q35ZLrShfI3_>A%@bj>GJ)R*CEy*d=Hu#V}d&s zHhMIX4G4qNTfa_<^byhKW!q}omb5B?hlR@94xIXJE1)X}x1mWAR9ehhTng0P#xk_; z<koEM;Ef{}A_9!EpuI)~3Z&VrFKrn89LZW`+_o%iS+GK=r=X!U-73zjfi1Z%8QJsDR& z5g~VCP@P2hAw;*6nbanDFEC~0J^+3EYghVQu}1_S6Od(yQ=GB4MEYI$H}vYiQjbVI z^pU@%9|gaYAU%lfGAn|!pwOemvF`7M@^2>iNVw*I zr)OcNQV|X%D=Q&Fd8tC@o=nmbq))`LL;|HOIx3;jV|k2lnR1Ey{y{n4O15snXD1!y z0JqK{`pNE(422mi*1V&adC|)4!s^=HR};pDEih?GI^ZH9p~dy~WkMTH^ir;X)Up`x zuH8ulJR74eH>CjpK?)iDlk|(*{TW0rf9I^_o3_O7TA`fW9D z_J*+LVvAvW@5Hf$@PaVfr}4*2^PpAbqy|Cb!|@e96Ocf1Wc>Ur69TK#T!Q;}!;KVx z(z>aCu8@U|C=$2ij~A%O4TXkx=qD8@i+b{|QGSey%|b%agixWOX4afoIHSti>ZPoi z;f>e4%Uz|FP#+!Ay1|8?G@m!aIZnfQ9WeswP*vOF2DcTRt+||c_MI>E%fR0?Sva(I zG@xq}W_CB%2&@-cyIgE6^u2qb;yh0l`NB#Oi?^2I88%gjDJw2-jT&X#W+^+~TZMhb zg_Q!cVm{yS9sRjw@8r?vsDC-NWOZ6^bqcF-c#dL0o&&U0!W{c2ktQmNdLY3*4-Jrcr0Sq!eaS;647##p0u$sVlNXdD@0 zbztKmEh990l7CN@RGI0H;+k}BuO^adOShYvfZfUElT5LFF`1b5Fj=ouYvP?{i`cxX zU!X_xE{Jk8B`>_6*+$e*C?ksH|6@$9!6YR75wKcl&Ef>1qso}(^*cn8UDs8NGc#U+ zLcs3c#MCP5kUulAbTjFwDQv6=R(|rSK`surW^6h5`0s_Z+g_4hZn*%wI zU4yn^D;Cr$tO_#x`NS|ATA#^HUDH{I*d@B#n#m1R=(9MD1bL>FCfgsTVx3oRn0^KF z-vqacN^!f^HpS^13g@kTd0M?hUMppb`buulp~p%jE60@8y&#!!gV1VNtvg1mVihH= zDBou&&*ce9Q5s&JaranG*&@4@%uDtbhCuxdxpe?n5eUi~^ zempm%ZihF{eG!oa%NCTu%+`!?+wJuiP9>lVD=uSx$}u@`r2L;bt#?YC+8dA-yyYsq#~oUfRpOhQqIIfqDO+8GMYu=EvC zafQxgD|$nzT76KOLDRP;d$%FQ68YQK$tqq5GLGR>p6PNv^yPQ3NPF)5;f0GiU)l6MMuKK(SXjD?^(oJTr2#d<}A)*hpGk(KRs5mqP;n|>{ZT4|O8Yin0kF(AI4v6O-Ik7P%q#GiHTWZw zILqgX`3)0(UL$adDL$ej5#rR6DZX%UUtHr8TNk%32U*eV+2Gt6Bd|#8CF;7PuU6z& z6}zn##sb90v92t-7Ag!w@hXt>qlfm(s0{0g9!y=7S#s{A^<@7r`NHR@{iedylf3)6 z@6s0djEdKra7KU4jil5aVzDiJrWcF6ORn}y!s0_F;ZZaG{6=^E0Wkk25c3gw)~g~Q zbvK((kFctzp{4fv&xiv_0rKCj@L#_4ko_mM`@esy?*CA`|0Z*DROJ5w7079}wq0I- z)^C0c#OTK9@gKn4Gv%kJdf`VjkCIljynLVX(%#e`q zL)22>*?*ELX|C?oFX37PAe-8fi5~K{j3A8w@N}sQ_G?=PDB?lSET11X_x+7dk#rBy z!&v5$B;ockKt`de>140)u>=|M)VPz2b~IV9S^ga&T{Do_Lm6nB%esm?>!gGpOjaQG zr#*VS^A@HVOKO*zf;l^k?`KalPV%U%9#M-jx{Cw9y|f(h36%haN{fbDMQf@J4?qFK zdQq0$+o>@lyMubZvfs0Q1P7MJm125ghBsw+GHc@eb^WhLAb{eO)F3A1@^S+vbm8OyYMr?7E+xa^4JJ;ok$K(6U!;8-s_Z=6I zaE@-i=gi)XEm;CWd3n=_s$Q#^EXTc)-ZDC=_D@7jqM4HRwb|;Tglpnr7W?PUwvo|G z1*Z-`syfX4Dx=_!PKhk^E5Y(oaGBrI1b2+(oX$8 zwu=bN&)drtsj!4eY~!%Iu4fTfciP&M0P8g;^#_l0X>Co$)<1j$ffNC6PbnF z6^6_hX{v;xjzr(k&Tutm0!JJVNZ&||;RfGBgQT=3l+H<5E;8f%$UyctQ3pFz(Bqgm zNKA9f@5X=7(&~cpb($=k%EyM$G-hw*$3xMGsBf>VL86r7d|2md7`fv(7I9Ttpo}}d z+j70krdrEY9)DOkMP^S+M;u-RVKn~2bnA5qsWn(8rJqv)LKPl2Eb7M*yG0CbwzL3GKo?gX^l=i3~*o|apW(Sp}Ox_jI8ET zt8Bky1VFfK2at-~NH(TcdBi~>D1&?8>Drdu#HMnG7~ci<^e1%ra9d`v#Rlv_u@h4n zd*$3*gs{{LuS{TYK9fgr?aCAvr4R=q$~8<(@X1fCF6KQ~tK?Fn$;&pFs0c-oF$+90 zS!YlwQsJ@d!4)++VYsneLTLJhg^c8Y+@n-fVqVmn0z7>|f}wm~wfxbrL2fdgQQs3s zol)8xZE21{X0^;d@H56sJry?ch7u}Ug+f8Vj+j6fj#*j4B9L*^vCwlLy#Y6ojrKt+ zrVKYlMak1(#mU95t#~R`=Gc3;t$$I{bRIS*Z$au1&0#f6m0Ldyk>odfhOgeV)@F9D zgOd5npLxhW(OZU=Rd6)E%RfMV)j0DXMi02A!Ct%Ht38tt`fHae4-*AY{jg@eP>1dS z>LcmMmV^mc4wV-65mdyBCz&|jj)cl5sVfAZEkP@1D%AzYkF?@J5&VY&LQ_{Pj8YA` z)QG@#h?dpg=F4e&y2|1|5GnHExfGSU@e8fc?r>|8ot@0bQg}VD5`_=gi@LbKOzbUF zrA279dG((L>@08_#`!V(ecopjuomVTA1;5z7_KWWkQ=G%Qo6aHZh9=uZ=jHD%~ul+ zU?b4FmY_X!dig8Oa2LG!qz>OYmtap1KC4qvqSGFqyUfmW)%0?xmyN6h1IC1Roa!e* zbC-Y+i5!buyX&T0%Jg#0YJghJ1yo+>M%oA^KP#4T%gE2Sst@t-YYS@a_C(eko~S&q zvs4$2-ZLVh2R}$A_*quUBEh4ApCGS3W`A6gUu9oT%akoj7~DXc#6ruVh|ODY8Fj|X zWfzkz_PZ{D19Q6&K43ZYi`RKwf|O=313WUGIARI$hJ5$1Ae|@-C&jiCMPf# zsdJN`kDhsJh&}Qj6%Kcf-zBx_hlsvW+qBt5dhFG;D@0FgBM&@{dcIUh!BLJ;D4|!R zA}5`(nAPB?Sh<-4xX4#~p;=aRXOYP91l_S5)pjuvoj7>|Jo9#PfziI`%Xa-Mv}OX2 z-kIaxQuptKh>s9i*VM&ly>;0B=vn@biR)}wIGHVdC`>!zS$|NN$RwqNZ3ij4%ya|D zV!a_h*qRiLbI=2KG|S3!0q;S0vt~O;+pr6F#f&IhJAP{OpK+X5E(bj@&b8zZ+x@y+ zVw!)7?V|YG`sIpd_U@bPN);D~*+cg)~8Dm~<`>6AZ_|4#V^zfk-V*_e z;=}Lu$RsUvhNh-+Iz@GRT5jN{hp1C88Gi?Hww!ZrvG=cP`9HUbX>&rXPk9YS}8QPORX)xa%JYQ?L= zWe=XYFps+f0q|}5oj1LE2>z!Zgq7E%d=*Z_wcCb)$ou4&o?nQY^T!n!U%c){FFa9* zk8NH;5G60TBb8xR_R|9tZ(m8lOgW=B95+F5V8{rM7@}TL1)=7_!uP;TTTeAwtRz!_ zdUXRGvXqnf&-KH{A4C>)PrTs59$}-CJAZAQHvZ=dv6-X$#qEoapIvv)-_3AAXRM7PbtDD`1`{?gZj2Gs~gf5%OQBRX%ek_%$L>Vb8 zt*9%(RY;8)@C9~^L=*=dpmO;BKY#lZ`dxJ7|&wvGbI^rjEX zGv9WAs-3FCr((I;&GiAQ@nLe-?QG%ZWm9Py)%6%GQGnmDsH*yAs14PVb{1lV14Gsf zF~{Qj($#X$U!!_CGTg~@zs89l#*>w&hA84weRqKa%PXAucBKIQJA26u9_K2*q%9s% z2gfozi$%aVqH zsZTd?dfFZ66u**PLtdhc`<{5d{s`4arWIznpqA}d<0L5dq8L>v*pbbXvT*_fvk z*UU7R1tehfe8L&}5>o-}K5wHFYq~uS(;Pa!fda`Mmm{HW+=!#*oS3wgDKUT>zCMsf{Wbj1HuV7Y`fUjLCOI67J<1bL z$V7{uLprLavO(gP4FIsq^Va57W9av_52}BkDj={RXA7^j z#D*MIpr3pjcv$15(?)eyO=W`ct2>K2$1{-HA7fXzF+eE7Y9J5lHT2kjf1DEhooO%c zF)iGGU&vJ*R5bTP&f>K;92*y18;;&wix0+-w1HJY@1aWoIwzSXM}(IOf>q!f_JeH2 zI&~;0h&Lt?jSdP^T}MRS@9p5ijV!_oRkP#;J&@7p#4m#|sBhwQODCjL(+GSJ)NW`C z-pIl}eVmG>1r=OtWj3oKDXh#o7!+S&W42rj{MtR!BXHm}mSUik^@nci&!c=PWEwrq z!H@G)S33cz&}vp%MK~7Qn(3~c(m^MW!#%Ra>73-^P(7`53NIAeBaWi|HTCwtLuCnbhZV_ax+m0%h$&@{RaA)gjuh@1`SU7k@~oY#*=L=M7- zKm?1+#&p%=#^ZW03Kxx6a}?iFFl7BY;m$-GsF?ZMckVg8w`Qc~RIRBAK^C=YV;q3- zYHzW5ikR1r{-CDZKt5UD+=t+8l*b>I zN=S&~#&JXu3v|yI>Jf2}ZXgJ#Q*-zpEjrX>92W6>h(-Yy@lfHb?P*1aMFykt&RDXU zIi=1b+W8P`Fvpvb*AUSTtSIzpJwgmK&qPd+>}@t*Dfj6?!=8BZcw6RuHXT&t!)kVj z!xTKDMR&=%Yj7BQlA!~(#ggp(cX$-%_G}(QQw8V#YGrZ=iI4`h|Z9=S75$E>}be*vd9DXlf=UGH;Hn@Ral|S^>*`2Yma^A&~6h}hhAKy z*^3%2qZAD6=?EDB$5XU}K^&_scsb1BH2tG0N}tTTJG+YqtAq3rQLbk7fgyF7K`eZe zF}<`y;kxz2Q=T7&Er60***nDgK9^bYw&xSi8cR5SgRgATvYuo9XS9BYV&d^JvFYZ! zjJOTP`n>U9kAf(b*gB%(dx((dX3OZp*Au`VI1^iI%OU~#j}{VlN@KjTkPSJConBV#^Cp`Szo#fv;V?z%Q)g#<^-&|fFt;fD4*)FgDOBQ z3`D^$1hPav%aEz81OuWrlJ&OWr73;wzTl;4I~1vL#>1ox+R7598qQOi$vfZG%rrt2pMlFdMtACl$H?U!byQV<8Lex%K&?oLHL=^l zNmu2bVO;F1E8K3s;?_gwjytz}gXCnMm=yvo|Cx#5;hQP9?$q4v?&F$kQzf%T^O6*KAxby(Y9dZUBqL8)DzcILN4RPaic-6uFv zS$^zyfP}Q;?VE8XM4fG@^v0Deg#7M+sJT~5@j>$EBlzsYlx!;o^Xoss9}MEO(C426 z@8zWbNoM|U^E3Z>CGr2(+Q>+x$O;zdH4+Sc()v(?f-m{< zOvQs+mKz@;xCd$s=Ed5lkl!)jB*`dO-ndZ79fXG5sTcQ>v^maa8gVc2Xxhp8CIkRfBlnV1sTNZBRGWpWd`3Qkp%SeSe$rmpq zMqt~_T$`0=u!e^MzJBJz%GgyfE-UwoLvQzc*qUY284K_D$|5imQ7)cK+MohV8?6Ks z3PiK`j@~E)Tfr`QgmXZm_<;3v=lT_;A-oQ9vMw<_t`9{c|I0qcRAORD63dOb%LQE><6~=@Q+Bbr+7}~uEDd!*UKTRaNSD5t zQN&9YQM0Bh^9P``vL!Jw;Y*Ubn*vVti#OX8#T8e?+o`lMC|eQR+03? zH|a$rHh$ON?Z;OF#~w2R$GJ(DaUXtngaHtb{6U=Aw&FPZuTGId+XtUKi6py|p;Jyd zV_uQ$*2nwkphkEVfU%;71t4yBEX2-p+;yC7Vc51Mc?!>dgasitqcy1!ls0LZwAfLI z4&*MBwSfQ-hO&O9I9eh~_Vbu1{A9&la@yd`MwRu@A2gpkzt3odnoQ@gRm7%SY@#pU za2HH3g`AQGGiw_la+|UNUD|{%11Zd^EvIpHA0lJ>9lfgmAeN{=h!(LoP>A>Q0r07A zy)_hdLyRv-1#1@ciyclwwX^}{+{*wS^Dg6BHRelPDC}?rxJ=^{)a`;$IYAqWQ|9sE zabuQv#n(5zvmd~$Z4^_!Jw)i0%uz{IBvZHVXC-n8k|$6y>2Qmj3fPv5prqSE^L;VF zLfvE6(Sy4HS|6T8^=qcV66HZwi;!F(bsmczm!ft__R?k5@LlzxXOER7?q&(!Em)*! z;Ci}}%<(UEgdQ~-d`G{xUC4x)JwXFmpddH4nyF`x?TCFi?eE_KuA^<#SZ!G~+5ycOm;*<-sFD#cyinlrwI3(Cu$gR7r|_?$Q>414G#5 z#j2ii>n5<0+jPC&Xd@spXHK0z*d3E_wWt6=8S@kWH@MlsWkt6zM)PC7&pg&PEmCl< zdr8~h6QKDMH7AH*aF~Nh89**?^@@?c#86eD!(z75-wgjr&Gdb>k?dCo-IVB)!ZUzG z5h-G6s+UMw(W!)F8eT^c-w2{SH1#?5*kCCA{r4qhc?=w*gJy&bvg5uc>HFt#J~9Sw zeb?Hxdh~E4UoPblFjb9OS#R~HchD)x%+68c!E1;my}^O$b8J$kW>CGKgDkF@K~V)U z-W-bOwGMW>9V_3rw)J~#@37i4UzAthrkK{!J*>*JZuI>S8Idrk z2g573LU&-BM{AkOKJzf|i8)f6h(KB-qAMNRkZ;^zZ<%Y8?}RC##3BI-Aix5<5#pQ6 zx&l&bfgB+MuY~Ier_^H$vsNkJg*)%*Ii-6^>E2?of!(udAvhgi!cJy#N(5OHG_iD_ zk0eOqz9s-&lx%fP7%TbLFNw+?OaU{euYX}yWe2c~&Rby(=gBp@!lE%AjosJ=^z|AjAlVNWGo8McHpX zD7<XG^z#Py+w08cl1+y5NhWyi4fV zPChZ^bQTeA@h+o9E5#K%~{2w_?DQ!E``6+Y0+#`pjsi)AA^7$Nr$9I z!$c4OUK~INU-L>6nY*l$`csWYrKZo^(!1p4+`+rU=Wm>l|2t-%3yM?rH%^e?)M&i0 zg1Eu32*#olg9)vItgN!!U(x=CND+d!F^QW@0>ik%@Dv&u6|EQ(`B=?@Ho8$aOniXf zp{=Ox?JI0IAy0l z@m{dUeqRFLfIovEy3}5%dz5LXF5U=S1L*X#hvu+(HquJ{Muc|D$l?%PrQ4=3UaZop z(I)rzx?%D_q_+9F#c0e6AjXv6HKSvcRNK_4PML3QK_qSEC(ekpUt!&3XEfa2ao6Xj z9{_4K+j{UgobwH2Q|lX3e}Ie^ER*gdC?MEr>iqa}0zj%j_@6)SWl;@Lm!Y}-R7Bb| zargQsGuGv7hT_yo2#gY4(=icz~FRB)3Z|K6o`|UW9n8Bu)Esh;$cJHW8dzs&Tz(RKKtfU zA}0$#EOpW!l+Iqb#@e>v{!juld%X6KAEn!#cLY<#qhc9mMguH#RpN7a*>%sh zb>|@J6y^~g0xp+Dd*u10d%>u`#Ze6448sx?KJDLUp@>8u%oFhhh1jyQYf8Vc&&wTvMtY+R*Hh+*%4K6Q4`?0lw~IuIHsZ(9ZH7 z^AsJO5bs0dO0lx_{`gq;vx*?M15hM$LLYLA5&zbcM2E|iA+rNe$If@f?Dx<4&AYVW z=83@8djFdA%p7s*7%#1hpa2SpHoBl9(q?=_Bm5K z_Bn0v-}juo{{Ptn|837Z)YA3%RN(J36qmpOsrrCO>~C_U^6&|=P|}R|GKD}LAe@SW zTp}rM`c!f|Mn%ulSKqKw!7|y%v}V1Y_SD|t=2sY|2OhTW;$lQn1R`H4i#!*LUp;<* z1z)BNKi;4D0u~>sVg)?Eg1Bd*dJ$N<;-U!F1aO96oLr4)VrAP1N>7brQDc>3Sz_Tp zZ>AmPnjEur)wrWf=QTEb0PC3sSIea(JxveX$07@Lxg4xVj!Lr^jnI4_x!&TZ60Qri zw+?$RKu+$Fnj6{7G2_-`aw>oKfhL`7M&wm0p{el6*pgeVg(fRoW+7@hpXs@cHmM1) zzpjEHNo-a+)3{7HTiKA=Enh{45qrX2d^WybVtE2E8Fobh{+-lqt`6W3zWcpFd@^@B zsE16{HQ9h<=@wLs{pv04anzJ3%_iX0S(PC^%`(KD9qr8#?D*g@Z=;nGZK3VXotyNi zC@lo~Su#pss@y7ZqTgVZWko%(Lp3mmX0+)j8AKzQ=yzupJ2!Nb4;#7EpJ2J#3Y~(& zB>Kk#{R_-rjyQY!MP^i-ITNu4KY5Z4>m523QrDR6$e6?R9@P@h9GhV~5JcAUZ0OS> zO*QQ|oQ|fs$!gqH27W-jb^-gW$5^HRyW~899Ad)5jW+HaoG8U^#Ma&ElAWEhDYxr# zD}P}PHsa48uloK!4{4NmV{|#D(O%4c^zS4(q^C?39j%CY;k3~0d-zSeTFUiWYemE} zR_>vcs9%hNVZz+tjgHb;u#8?`BG4d5fI4QKYAE?8yX79oRl zwv=qNTHnd)i?7=q6?jxxVlA3}`@qGfqp_>+LyxIthMGLIjy2~PbP%^B>y_+>v+FyR z%YZzu5rQIC`+V{rfu?s6lL7bJ7L9o>Tb8qrmK^m9T>_2!22*4YUXM)dCD34{z?-q|Y?r02_{RE&TxILDHcmJZU(qHL;)2l_6#4f=y{m{2Skhqx3xbe-!u1JedIclW#r zqS~lEui&nH0Hd4_<~DquqQRh6Qtp!p1So-m(E{)Ny$n@D1ONR zxTX6=)hgPALyqwr6N!w}g(V}7WC?{m$QVdVLOrd3ZDQ0nL_#hVA>k*e96(&Zzl5ev z^o!zxzZq2hZ~PGK;%hY$qv<6Big{|xzY98<+>pz0Ne2tGw4|by7`1aD;5Sho5-O)* zC*e$`A7YYbJk8*I^1U$5-<}u!NtmYFUi7((Ayp^f33xE|Q=fZFh_O946M9tQMUz#~ zIChxF|7tk;|4Pu2Y52MYkV1Q3p8h5k;s||2JN4C=zz0q^rOYpf4vJerSryo-*I${2 zyi0fxe-fP#MZC)`Flz#T92-?j%ho1yo@Rya8;K)WdW@a3ry3QR27Ijv*<+sxaYXv^ zFXfsFL7)Zwsa&)FV|Ui+e|FdY_uX1;!x}>vMIgntq|t(d>-WRSH>RK%FEkBsZEPoD zX_DtX-B~#n_v}k)ZwrVg4&v7@z2eu%Lzy`o{U};w#)jF(B^8yG6|+EvhX+H$UNFx< zrQOs4yU@;%Lnh1Y%!MQSpT{iN;#Y9hxh@xmmL)W8BxS85l(;^jJ|P(jf{qabei8nz z${Z-OSUKxi2D%?&R$?s^UQ)1vIC;+H*Xeb2HeIJK<2~eyE5#wiHopndczKz4@F>RX z723kP1fvDx`MPhMp5!giW9J!rG?*|XUbI}m%f__KH!nC!wuLFe4+aPsgkwdN zglS1X$Sgz<-Gwv0+mq4olsVDQq=Vy2lgqun0I!1m`jI00jYKZry96(Ur|C<*W6EHS^L}rUlQ{ph5={}B;-@r`+-%LnJ$)a5l)q!JeJPu zzR=d3gThCJlTWL{K6m3XM8bIu3#<$ z%1uthh9*cL3`-2R@8ruK6uE;|LYa=bi7e~bNWL1}5Hd-s2Um#S&TPR#y=w~CknjvV#?WQEPbx_`Of^pj z+?Lh2xU~Jy`iz+I%@*dZIk660Y>iDcp%b@vxeG6;+-$;GA7!FROHo@}fiHI|PPVYh zS#s_$Nt0JFROGZbYTIu6PQp{-!k3cK=v7ix;X<3DtF1~8SFG|^FQW95aH~RI(v9C_ zQr;J(*Ged=f}5D6;<{DVrATWLyRpAHgMX%!!f#@o)_!%iv_J1e!jeuz!50LPS+f=l z$Z?8`c`3nt9R$$<2o_xhm68f1)hSU7GBNS`meB#dra^&Zsqq$)f( z&c4BF+viG`U7pkKk^(_lZx$*WJT}C!pyh5DKO(%E$iKBwLdi8_2s@i3F zGOY@ap6Q5V>sUFu4t1G=3mrsDA>v>@BHmZ6sTB5{ioeuA!NVzB=%0Ndf@bAIMP*2; z0`iDF5ZYH)*x$#$rX89z?&h#hSfmm!ib=0^a(2Fv3F8!$PIOdbJ~deY)ncq|%BMXO zFL)}F#I;S&l4^z7p6_f^z&-d9J6`*)r?BiPsCaE2z_9&wH8BWX9$A+-~pUwfE#@mc@T8^3T?W1#V7 z;?O~{!Uj$0X~PQgW*t&;xqGZ&$*)sAy@dyeJo0mzZFFfhn6{vz^Nw85OH`qurjkrN za`uoD{YtqJ@HPB#2LZB0Cle1}|GKMR~rQ$+=BISUjpO?FEuC}%~VcvTyiHG3uK zjlY%!4dM$SnZ3gIrhX#I&GbeW0bBIh+|pT|IWWZdbQVo|Yc#sCS!1E~cOcx#)O#&) zDos;Oc0R*n2@VZaYAP9m;&BHt6ah(n5&5f#DX84y{ZkWkD|TYszIF$!a)38@}vWmD(DsU_?06g0zU8b7~?WB?IX z0>Aw{KgI>EV8WzKP|uxb9F@2mpywhlmjv48T7KpInd3&JXwPWSIIPo{lfGr;(#q3M zmiEF$k$#)aY8hgQu#~-Gj=j~0Jp3DLta3oB-G*?pkJFk>zkg_NDhE4VX(dfs5zI4njvTia4OZ?v`?3^yCs~orC@B@wg^5H}M_; z6R~nwGXh2cnVm8DCcvHsbfxW9_j*GiJjjo1>P@s2ikU#uvB26PmSrI8W8UrzCmBR$ zkwcHzMG`?D?-56f%z|B{SP1%A?*n%`g|=?BpE~o`%e9UEsNRhz2VvFy+glh!MA~i?G}euK{S~1g*!Zpy`y+41*qKMSw zDu>hC^zn=J7m6|R>v7n}^|`B!Ac!7!{=IV&l$O2hTJ#DBeAiz{dbe&o0RS|kIHOt! zsrXm^0CJp?GE%k*gI4CCLNl{3ys^f~0Ee(h$s3$;y;#V!(JwbfWM}lK@l;Y`ki}@@ zHn5Kl6d%#wCS!*94HOoBsUL^RDQ@?>;~lYlRFOP6aGN+R5`zt07oe{tV=>L0Q00>S zZ9y#@_IfQZHQnh*$DN!;JDCgm`EnNTR4N?18dxfzWfP}z@Ix3{Siaq3OKBw zqg><`w@?3w7lRFZMob#1UGRamM@(-yFA5#Y^G-Ah88a}14E_Q2k7nL6)8uO!%$F~r z|Itu&`~N^T{GVwK|JB_43|Nr>n%kQF<0sJG^4}!HrS_Bm=aAt?Y@w$)5S@<-1__7~ z^CeGN3Ov7sMHvJCf;YBaPjykG!=U<7zF6Pf<8X+Pv8mWYHZWNQMn)Ih3E_aGsUe2; zUhrhAgsc1ae%cZ8NvVT7rEY47DQ(bq!BFBZHix6>ERR{ATbB>7Gu$tlJBCE;CcQ8Y z5}(Pu>|b4n1h~Hh*Jjvj5lE>S0brmAZuEeNM}$7fvz(h({Zw6r z;J=4DyV@XrALTt<&-y@h&Bi>q3?X~gArapfpcC)$5!dwPJcb8!@~?*bKob1z3-jU0 ziGypKjfuNMpyu`+isIay_3{mv72F*T_6%_FRp~2*w$(BpnslL$QD5gfm zSBd@(q^WQ;>0l6tp%6WEw4OJQsh~1`kO5(+G7PU4TcZveq406Yvxq2M1p zpv7GK?FH|CYc0_V%y*K-l@TM`2jjqsqhk?oq>x>1?nBvyqL5!yb?h~Zrdc5x##<)u zZ$I1u@s?Q4vxare^pZ>}2$;=*o?3Ad;GFtQ8O8XFYh#hL_|}_8ycT!(j;q@Oz4I!X zV~FowN8ull#y!iT1&QNfY;!o7@OxRt>I_+*6zSn`QG;#v~bDz$pz*;>)v!!0nE+j?cAx{R+hObCy!G4MM9#YqvI1p zs183^oMbJY-j-YylF#g3K;d+u^qn%@aLLHN`gjDNL4L1#QuBFJMZ|KixJG@>^W=-AA^# zY%UD3Eg~0}w<{oss z;lG)o;ZkOo6QQ{bGoxINxqyA%1L3JMqD_pV=P7deCK^laBT;O4|KV{6*h}(tXW)3@ zW)nJ0{E!=(y+J_j9jb-opACKH7~}}WkYAEm7x?q1!bA$h&#U04I)m4H#-$dEDb@BC zPoX>0Nof(3z3Cthc|!&LMtPNlOS0$TsWQZ|O1t;4spG$sC$y&s{?1SUF=Vgqjsp9L zFxZ2gp$V#ttn`3-O(9ha3ZdI^0O%qpI)lH@%y|pCl$d7*DBYVQh}zHeC6#dw@r&0&sBKu(wF9Rj$$e} zGAYI2vk>MrvUOinfl2r5TrM7eLtcUf^4&o>;_hLBcAuL>4{f+3(@* zG=@&N-KpEv#A?y;X19hkHlhU0dXb};j01InI|TKrzhU*~lNG6>b~+ga>>@$n2jrjv zUkQNwad-WRg7+bRJ(xaap#EEMchS2#ZtLnS)UG{KRZZ*08@Jml1_1^HwmGXk&7d+o z_)GYun8EUeyin?2hsh?YGK+YjG;M2z(OEL;B&6cwh47b<+nf5kx=h4Jm0eEX)pQYsY)a~`dKv1c8KL6|^8~(g8nJ=1+k+`V3rzqO2qFAh=Vjt0Dq!oozQbR@Wikx9KRZ*@ zZ8%YSHd~SJ(6KMBHW(GBNFaZuP(7IG6UX>shi8t+rlkRbt15_ydi@%4=tEU+hj)0I zBR>;+SB;hEsQ67w5Ka?blRG9-^-tq9K%sx5jRDRHk3Lar?WEw1f-b2nv%i8hyFq;4 zx0ZUQ|0-zgYQ)e;?~kb8gaJRW&~Y1=?K})$sf!S9Z-Q$mzt1_Z&`28Oeyv!bjaNl zjbrE;V?{`JKeJyPKzomvjRN;pp^6Z$X!M7H6RE_p)bWO5WoCfOihR1-V1eN}R8#XM zsm&GKBxa5~W|B%-d%tQU)7t%Ko24Uo82i1X6rb* zni8jQvV6F_k=R>!_%^Dp5%oaMO^^*-4-)deHy)o8K%cz_D^K`g2JfQ3@PyQpe0NLU z`+ELS8PD`!n0n&rV|e2lu)8Il&i;=54}nEHzl7BMnUSUaANjD~|EC0&r@7g`GLIE4 zL>>M`m;E=THLR(xim#6I9cj%>Iujf!O1!$7eIfpvs+|p^@Buw6hc7ItOs~s}P;bU%N)-+5;f&>j){N1122d}(izuC2|-jAn4 zt}nz!Y$0C+5k&^LKQiK3a0}dJM%aVRe%spsju#Y@2`PBTruhZ$zL7D05GEe0NGCS61=M5&wsnNHo_7Z2l2_LgkQ7HxHY|*V()B^%2H@Syu zoXuT{I)+;ErPNf%3oaQPpuRHuv%ffl-|pi#!w&JMRKy4p^4Y4hibP3EwQ)m34xF*M zFv%;mc!@ic5_5javL0CtCYsPfO|Mi*Z>e!aHD%H2usy5FPxC&(GYaMw@UKQnNB07a zs<2xStAAuDG@$X^CMb0sP_jlg7q8uA=6tPK&Q{QUj($ZgR#Uy6)^(cDHV}CPSG|j=BdXQ`+C+CRb_@;h5 zUQhLGmUZs3U`7|{F(>GR$H75v-;#S`l+<}Su)8L+KuHuGJ&U`(C@$`1eG_K|0j5rG zr}Nwr-cruJs2(gethkS;eqKZ}Mny2gkrh`rnpEJvVbqAgqlTD5>c)_KqC<~4xk44; z+KB1h^b2dvqHT*z9n?80T&(iNpHQ}DD{C(q{oU5}56$u8pY0~hd{O!WM+?{Q12ylh zKW(zZqS=G9S??mpZLU`61**2}#+kQ=d~sOU2f2fp2NxH;m#(Flm@y3Kd!nI0e2l$^ z%+YVXTokxbfOBd&?Gd!WC6;V65I*A)PVm=>U+{aib!o;o>EgyXKz*=|Ob%4S!6&OE z%Vz;l&4@NG{ryf+*$^8?wEB?fSU|{$t>^Z{BVF{@I)VYbD<^#CpSd2PsAtnRv&ptN z$T#8mc8-OJU6M&)&vigiE}_03$e1kf^XW6JF|!Mg1kXcr%4*oYJp#{b7PS zG)aMR>ocpeby}}b>n5UKcU~e&d_83^lE1hUqxl4o_=F?_hbHMhjy&X*$bR>0^Q zz1f&kd^4~ntfbFXAB*A$dMHP9MyDD8n0(RP8cT&uuMPPg+JqI=8}iYPtrh^mq7S+E zEd-KZY&L&(caV&v2McqX=fsGdMik(rv-1O;eNXqbK5u>{yp{2qAn$vcr~lRzCbD^W z0r7}iT9g7-;`z$Y6L-nB7#`@{-0#n3Z*y+G5L{5wLiW4l>$>VIziB5g9egIfGc*ui zK}|n*?tyGu95v;yuDRe9o&|#NpKA= z3wL+-;4Z=4-Q5WZws3cM_u%gCuE7@W79eQz?_G7C>c8vkI@PC7bHM{Q>tfC|#~AaS z-}uI#R3RnK%xWfrFG76c@#~Jd(yDzuux7RBG_FXHv!Wjc8_$lY^`2ZPu z7o@@8kCJ(79TW@{5pyU5br!<%Uzhm;>0`a*P zoTsiD=G(Mse2SNs-8{KnTD4UgXF`LKj9nhNRo>)WaUp}NF$YFjLRyOJ*xn@fZ83XG z0O>9`e5eHKR}59iygqV@%5c)s+)%#I(h*W(k<~oU3m=C~dg*!Ft8czJ23?oGT&8&* zY#%mUrn5GDt`640@Z}p>6$Z3eId^Q~a_D<`9vdQEt^oijZpA(eGpWbS$Y~G)BXBCk z=~EZ=jw~yNF7*s{D-N$g-yo~ZwHfwzPv@{mXWzj=qHJHaA-TKO$Nq$xQAf}zE8`%S zE+WeTE8y0#HInX19$Pf>PjX~%i}FzOHNnR}tulR!tjXK$XkApG=N5@RWO7})9bUk= zV`n5@t>TdKi&S3}g=Tbyu2i1E!Ss)yS5|e9Ie?CZnz>o3MJ?7L#R=vj@d|{t0HQ*> zh`&++*f^=P_)!kE4;~)wy2M0si2UwE^V15zeJO{0*zp5QJ~jqzNqGwO1qNABLGAhz zs%d~u`?aN_&=b|=RX|a3LZo?=uqxX5*U4A<91Q{}(&cD=lCjP191@K|gfp%pN}`$w zr#5g9AV;(YyPmZ7Rg$e0m$lW@ zYiRH#S@-Fb$;aBSc;c11>C_4*5%1femf!mBpurp+4>A zpb*$19%X>6YZBM=U2Hn+P(Mrm6n#Sd#00bFoc5_C%A85dFEH)e zGzA$n(@u*L?$NZt*iE7sD^^6%Vyu)&-wmp}sKw_T!|_dM!I`u>Vs=FtT&Fh5{87)3 zHaVW`#NFR*b)X=V;WYiA@D1iB9q?NuT(#ZnQAABEmW9IE;=HRdDVn~uup;t2#~5nj z{Mw7pXK;_CpQ_fI8(o@lF`DetBjx3=sZw&(VD3zHDcbCn%Oh$2ycZqVF>oMp7~fua zFY6&J_EX#mTuyc1Enz=26&8p1ES&F%rACdVPE>uh%g!$(j1Ky(pOYLZ2A)OP!85Zy zI;lq9_mk1)YI)I&2Ed8&+a@Ia+Wmp&c$efk$|jeBzOACXf1F1~v)mBx1>SvIF5vsz z=OBwLtVM61eCg==aUcbM<#vsyYTp*-3&cA{8xcr{7rpNHtfd%|CH!0PFa>|!wlsgy z_Lir1ADi*V$XAv6mQ_`#>7DL?OE3FiHuCpsOI?jC@Xsh?Y)3>CY9 z&See6W>RILRe|A*DTKI~Ur32iV=}R#V(}f>Z&5spPfki@Bs-96zr&KBvnJ<&e zb1o;&WF9hf*tIMSwCkY2NEc=cF004j4JbzS?N5n63nsihvPHBcaS}{AD-*G&O|Wc= zWF4aVS*@J+r$NXUM_VdFf}oE?zM+I=4LyRg5rxYOaJAwjqjDrw zO}VFJ$-;p8tR#NqC25ev6S7+QfaV3qw`EQT>$9cwMIeocl)RjhT|p#*SP98!aAkdv z1k=biDo0Eft}4NO5mh~^!iYrbEP}cdjR7XMf5B%SLhBE zkNRuOOtK-O)~E1|N%mXHBgfcT$IyGe{fGwV)8H-_bJ4sl4*fGi$70Eqk3%F&t^L~s zvfZHGYzswQug{p+hD(!2=E8)XgwEzK-7mXUoM(jV%|(CK`x8673Oqui>x$z%zr$b1 zF)v4eH7JmSIg79x1H$~4Q1>Y51FiNvLmKIm)j!JE>7-s;Tp#_2Vut!Wq)mBr=X_aq zFMyA>gr2{xPb4SHdTw$Ujw%}K+E}Exd=Q6;z#m|!Z9+Pw@m%ED3mYF2C@7latHg!!kxa8S-3N$L5HiZ2=QPj!Ozjg2lRoB64z(jVphO)X@5CpZkr_K6!QOTuU~NREE@v&v@L@0UOwQ&YJx zxBBPbrc~4P*puzK?hE0QV56%ELt(APP_+}ROeJ_U@B_x>mP0lne50aYm)PWep7Dss+jKt?Aa5U?4_V$VmRn z5p>{-{u>rxM6xccJACxV!_F(e`<|h~PFyVn33pISAKO=OfTON{y{ncTd^GPU!>_1t zVGP%Wi;x87AANopdY8!;K?@-~_Q#*4XfTj_)HFJfZ@^?ubT#yOL=^sQ%QRZ{I|$K`khn2z?bI{Aa)BLw^NzYrg>F+5FRm}}jU(LV_ad+4}&z}Let zOU@i>-yuMK%NEZ`>3jJ^k8&pyL5O`9jP=b3J_6dYFxQ9viBs5M;!c?U7==ILSxHSp zw`nCG@6G3#S!bpr5?_cTp%bfBH`eBfSvJ&&%O)N*!qaOF&J^xEE@0%bJc6P5S ze*}~#p_=C>Iw!DUkhpD+Y~~7+36;Jumws^c@|9CZw97R#<4{HmK8zE`W?z&qsXbNS zuf3i?)gO{0VZ&u8Fr}~#aRc86RfQR~g;>>;;HpT2qf2NS{EL3D zD~_Zj$-MB_EyF~~YC!nqPP!8MPN~P{^d?&}x%mi#mfO^>CfGh(_8^5ur?#l)(5Uv6 zAw6r5eS=f;N(+qLhA8L7k0>9qsDg0z=!3NuHC++8Ogo~+^%eq7Msv_qtrK?MLZ6-y z$i9yq!J{O~XJzR*HHt5Fh$noGdzchY!vusoe}k`Mx7D(z1*I%xbcRI{pEr-XGe@0E zXgR@#X+5&DFyTnB}gmK!swK<}RQq>QsT>JR` zxGvd=Ss4YvI1zzUwakWf6OY`20|f_t$7}Jw>^X6qIN`-iTJ|z|`a*I%;@#@?fa>`V zA>>`QpNRhAE$7=lHmo0x_$?IwN(W>1f4;W=do}-WO4!c~JXy-Q;nblrgQN`9aqaAR z?D9IWzy^0^=G-Oe19rJAxm{h_!RJ@M?k!9QhiWrlqt@iV+>^(@QBum!$)suevLfG3 z^0?e@Zfzb;Z2H^`=XAe)Hbm|^$9;7K zf1sAyEeyaI!j#+Ahf4U$7dNCzrLfZg4t)NY({M_~u0sc_vCFM#4?+SIIoDxcMMXSUtyv3-cW_{)E7O27eFxW@A z!FSgNAag<{VqAlcR_xfUR6PQ>a#m=0kHRN|>=+icC@44{De!oDLDbP`k}R4nnpYAnB=V2N|D4qg`-=^IOTLMoS6Yd7?SkY{pzS{K+ z&RUe^i!MnE?Nq2a>LrvCRG`t+as|b*0@|n$x`Mc}QL&R1SJEUYD&x_CG)-QX?EE`{ zQ=V!TlRaMuL>)CdiMx?2K)RLgm4y#tiR48%$=xq}-u^o^g#~;zJ#LslkWmK49Ev@6s`iV&Km|eEq3^^TR?NBnmw0mL|t1 zVj)+jPhpO%x%%wr+ff-IFJt1qnV{%XA+J^HJs&4kcC1M&IL3@q>0mtv*m(>xqE3aM zue5fuUI0SOX;uc7`i?Q9NKLlb?IBf2kQySd63ZWaDM&}LU7iLYpyGUZ%rcI|A5Q~5 z!=RNY3k^3}`?Qk!0*qMSplD#pzmS@@DQ#aw9MO^YEEZ32_{>78+o^nS#9D}%(9Vk z*`wm`zwfG#Sl@pe{0?cWn;M2KpP;U$y=^~Di{WN1WyYqY)LK=eqUwPWu^s%5 z4iQHCM7g^3C;hJsdYc;}THhHqWrKLYedAZ@V?1(4INfSJT~?*pW@S2>;2lF7aZ*cz zuPIA`;Y$=BBjCP@?wWEh7*`|U7g_tkw+?06Kydu%hs}Ip~%8eQW#$#3`p@cNdqy>h$hPE9 zy&a4pJ;94!{XV2SSE8u<94Hq@Fc<>-KDWDVQoUnSLs6+-iMIBxkK!yS1J+^ibw%Q~ zc}MsT&3;(4<(nm&J8?u;?8~zTu_B1t{2RVl?=VTCFFp_if<5rX@9&5irV&F^+@>K) z@LU?k(7$p5XL{xiTPA<|hbDqg1L$7zA=P!m`d2AL_y0f&Q8qJiaQ=H2bLU^`$q(s6 z6on0g6*>%+J6SdohoS7}fFQ$K`5rG0+9nfY5ZV(lomCu{R@K18*gylh9SH>#c(5RN z-X&*YOaokED(F6wuilOZ99w4!~CN2w*BLG();V`*4w9T zKVJ+{ObCMr(CMQD#?}CvlkM;hH@hk3o^dD%QAo4}h}uxy4-rao z_h?|28yJ^_F87BQ#!3j8Wq*hzTM;h>Mil3e?xou0RkNRno zSm~&*j{A~SVy*&nOxlhOe18&PbrwCDKNCMA6&w00mpkd zD%PLbo0D!&oF^zTMJNS~&z=7&KH%p4xTkyz1E<1;jAl=@#27EuUtm~HNS(q}7p&4! zr#VuzaToUZRv>9}CeXxEqSMZ;(d<)Wr09_A=Sg)Q({gLpPfMLjCU8Cr&X>Xx2+^vn zujuk+6axREbMs?-n5tsu+aKpeprVfdhW4-u0zQSEvZI_t zfkjk+m$#L6a|Ccd46cF3Q`j)e!Dc9(jv%ShVNr8V7cjo-NfwPHVRq8i*)=y5Rf+h# zUsugoZjAGz&DEm(EQ1wwGNIU|6n%h9iH$!9xI3)0`_F#H;cx6TPm8z#z z>Hi$$5P$^FIKh0pNf!J<7cNQ&QKDMsa#QS_A{N%;DH|AFQsU`$2YcqAhJQn_7_g0o zW6MelWq)(tKIZNpqCsspw&*N5%rQ=_A;;jk;lQNd?+HCq9d2|`R3;OZZaW)ygha0V zEOtujM^0mK`?;BYe{IuhZDINH3v{tL=A2*(o3V;M_c_}hp3C%2onK8NNi4T!oo+$t zG){Ey;qjQRWUo_x!}6|Ef>K+7k*rqh>Yd+YS`yP$Y0}oSt~gtkbiFcj<)-0kZFswr z$e=m7>PDoF>PA?*sxQoz+Q&>2rX4dVDz%OP6G$kh@zw%wgO{HtbsdDZg(omOh6EELyQ1pj2MD~U5L$g8k z&uspZ8Ng;*u4d>`n#b0j5o=atsBV-MchEB1Rwb5xH~6!*%WAd$*K_%)hO+?WD_Q?@ zdEL+8d4g#Gd-83-xYKz!yU_HwZkqn7jhtHb)S~9bkrhu}SK+!lXf>7s`miY9& zYpa3|SvxkN#&XiR_44;kSTAJ?ntp%UtQ^^8Fdt}dz?qm!2fPvyg0SWH??!Ua__ouM z?w<$=MUM6>Als)LFjt0s@75N!Jfeco+I^1Sqhas6j@RGQE4(xewyK1+T%*t^@{`8f z#A6gI`<7+*# z+@RW?lL--yr>l^rVh_h159ief*&8brV{C4N{u@T2-p zD^Rkl@#uzV(C4)(aQV7+jCcG?G!3WCNg=mhI3VCl#Ut4pM!$ihQgsKlnJz|4eV0Nh z)S(&_MAKJuWXP@`C~c-w$hBr`iknr1>mT+B>R^TIsOAcO$X?&h2rTf-+iCu=h_Si> z>_+{^VJVvRB_1JeM2`-eLn?moO!*Qj;rDw_n2_lU#cvdL6Vlj1@yncG6H+i(ewb48 z1^Gx`JxP=dmTU)fO!q$t*~ z>qsK=G)bF6GxieQ;3!aagfxinUJl>M$$tKbO0llB1)2XyfjgHLxr6sAsmAtH3KF+Xg$R9Y&d?M@y-41J+A$dMT zc#^!JZw>3SkW!cP<9ELZw1IHY3)L0(P~O7!y_@{klvuYIWVR~o?3d4B3m?j>8(oqI zOt?Ern~M|JGc?wgz?s=n1MT0YtiJ`<`mvSYMSPA#oIhQbJbFx>&M1~C&Pi&XP zyXK4K_LesW|EKb65@y%7|CPoY&D_|QXPXy4_`1i}`i6>}6Gr;&IUt|;tDdjp3YDma zRQcOgEfZ4^-=jc)TMH7!#?+)+{FAZRzEVZ*LmlLWMUX>;*s%m2a_z6)d*P-)TOwn= z3HKno$V`?tTU@5y(e?s?6oKUok`gJJJav<;f=xWG6U`tX^D^s4^P^|MV7~9 z`*XX)+vD@{7MSgDvtZ@WCnjC)5!9OCK*83;fH-3c3m~!9 z2)15D!-XdfQY1rcY6v5Sh`9;Y&gETk%=4oOi~pY)fPNwd<^x&AQeNlI`2Dmf(;w#Lb`Z zaHKY~3*gK;tLvQdH#u`FT50aC#%3K`p>^i@LI63~I2cT+8U+lRngnW(>}e1N-M>rf zz=Z7)EW`t?_vPbvOPn+4lW^41vWMA@D~l1LQ$}LT|u(u()6Pa*moB$s^05;;z5u_kW_vW~NGSIfr?q!Ooh4VQ>kVpXkyV9}+0xK+mR zKiIu@U-<*g=EcV7%?^0YI5cmOho6{XkL99gU;s8|N`$dBCbJhVcdQdffd-sC(j@9S zim3uRtr;mQzK%$_=1f+2R~t-IaTK&lEfpII7{e0|@&d^sY|)@HP*U*the$BU<925- zGW``odK39Xip#JH6}ji&5ly*&!cX-j7Vy)aH*Ha=I7dH3h6TaQ3|woE5+H=Oc5b zR^Q#eXNHjl)au~2b=7R48_e(x~tW@ZrVz+5vrwgboQWWsaAcE#ZjcBL+pa zB}U94nu2UJ(uy3yMP_c} zuTPD0;zxSGnE*)o?2Vtt3`MBJ&#u@c82d~3o$KrhDknVh1DVD7*iPlL!fmNa^>~P@ z5P*TzRM&20rGw;@x|71#S%9XHmf4Dd8bikNEMNOOx1gbAjl}wMTe4TYN(1aVG@{P< z1jB2tR&Z|IvKz<2#Pfnk zQ@A;!;FTzF#;!(vCukW~^2snvnQWZ$!)|J&nc{88O_F#=l>0Hn&_u5T*NmiyMe&xv zURvbD?g-v{ft_QLM5&eoKvY^WWO%*3!hpIMmhnI84l&4>ya^-My_Z`3? zf5E~ox9yLM|NfTKeUa}(UK_kpjXzvYI)P#Rpj&Q65dc${xMz*D4C6~By^ zA?c90U`p@LLeMD)$ZYf}THb|6@d(V6z|A#mCK38vS40EdSfyX{wf1F8}5e z|F;zLA)7bATSk2sMByhmC0mJ(AXsNlLN|h;D|XM+-X@0l?EJ|nVrI8N9^1;l@xz+e zdOx+$&U?!vy~!!&PR@IIh#~bW`h)%abJsklz&yy{sN~k2LMX(HBykHqXS&PeFx%_a zTs`LfVHOI^=b8vvm-~2-#u6WfCtiO8QI8)nIuV)4|5y|kOA-ibz!uzKAhg&>MFR=! zI@Mt7cc}j8oQO(!b|lg#DeamI`P2~(S`_SnuK8`urhnLbdJP@T<$Yz|5e%xr|4`Nw zc$Oe5b&Q8RU)vKA_V{$H03W>TFfUySe#sUh3SSB{P3^vdpFr6A&O{*ZkPxk18AZp0 zUKijKfgZVs`w=fj3~jmjSALDpcxo=9hmR7AyXvvDbMR!T&mqD*yA8re%WI8kQpTmi zmyaeElVkphXIPvGGzr2?bo(_@9YVF(utkDN`ZSxjBjw7xFH6aF#JT zVkFM|I_IP!zp5G^&S6C!0C7K4f7h3z7{u-PF4giLy@?}wG_@$T=Bd5JDzY^tbXpGE z+7<JHA37%5!?K?xWNufR-{H7DQnM4V)KG$4r0STKon zl}B*6)=!F4+D(=v*xxdxE(F3Xzz#5dwd?9Nv)=+N4_$$G#2RD>R5z@U+MK(@*`?*) z70)zgld2{zf$qN-x>g}b->UNz_s^&gFP2+rSJ-|+coplqXXFXYYo=5v*p|WruqouV z)!@RQb(yWF>c>oCX=k(Ym$GjJXr{=Pg2kQN+F6iE5E# z1YDE_LsZD&orR@m{yAxR|DwcS6_#(3(t^D~;Kbk)RW%-na=1Hc)~r~QEv>#Yyz#2N zH&wB-CgHBCg{52UtxZ!FYpm|W=569`%$FbDe}KB~6SRbuO(wGth$a}r#Qb3=bAV>w z&jTlrd*gT+9_E;t!W_lq>?_@eXby0vZza!%!?s}w(D0rfNJ>n&=EBAz3t=lamz@g~ zgu`YTt}USu4YrEdh-Y0aw2o8Lp-!M-@TgcKKX-@QWRU#{TPaB~0U8e&p@2gWN&KZn z>K$R5exs@dj~^r55~&5(ysZvr(5nHc)o8e$Hg*!%>Z})_*t~l zT=)|C6eyU)&YDlJlj*|G$o(xPuj1#tG-XTuyQhkg=iVYB+D-_ zZ)w&o(l{;&a#o=CIJU<5q9apzy&<_!?2K zd0yU#@1;zls^uJp=e-v1M#r5x+i-CfkXPRa-azhMdZgZh=B|Y&o=ilD%R3mf_P7`xS@tS4W&$guHR6TtfW3{V5hCSJd+76 zTENV+d;^X?1KcJ^1EgP=3F3v&coy_DvyB7igSTrGxx>Ug3pEPQC&o6kfnRbP;#R{i zVx0-^uMHz@lMJ)@Sw^1OFB(Fw$(b8*!bMuoM#N8}b1lsq-5DJPok^i&kFv#uj{lx7 z>cw6#oHcV%y}fR275|2hdTnQ_yGW0^6Bs;28|5R8C27k`>TlYJjwz1wv~kT8{IADxWsFvn>_ zZZWyv2-hX>7>%ASU&YTtquSE(()C;{QRQ-^l}v6O>@)j+GY*(vS86>@uWG}ed&G76 zLoSI3(+xR+p>sz|YkqZtF1Z4W_k`tToYmDVot_o6Az{Jmy|t}ih((edl`(b)_gH(= z?m@T`31?#QLA?+O6!2j&{rR+#-w74PJ&Er_wN0t@^s_FZq0WEGt3@KieQA0Zh|n_Y z7N-7tzJZb6_vsxumU<|qvmO-t z9v1jo5XPnw+8U~HfE=+zQUEr$^c7>DFDF4P@kPJC1Typ$EVNbRt_n{6HBQ*R0cuM8}qd3GM?(q~NiL73hHeqNV+we*Yf&eOECm`=7oS&0GFo z{XX>XyafNMPz1EQ-EH|R;|17HTtl;g z+1~N2?nie)axt+Qx7!epUyYGI1)`uJ%i9?&ZmE9r>--MJ-3JU&L$)DY5>SOzu~=(r zQB1Yc9Dj8whz~*+A-Uio&@qE;eGR1Q6Pa9FDWmu5WuoO^q`DQN{xxjXJ({w{oQKnO zviD)~i;;&`xOB|;@|q#Sah-^_gnMK=GBN=yo>zEIHRQ3 zDl|MACdHUQ9{I7A6BToyR-F#obXXR4;l#)2*JRcQz<}lud~u;>yqx~#p4C3yUk~c< zdlscCAI1{K|I+UD%YSzR9gR$Ej4aF;tnAGl{3ga>ZLMWB@aj7j`(VK%2N87?; z{C|W{OrfAI*`zO7PYdf!&9QE52w%Xy$l$}#doS3hmtPdOoq}%933_PUofCOD;r3nd z+QTm^P5L%ZI!H#z@deA89%mdakh4x6NaPVHDd) zVSfe$Jfv~9Pw>j8xSQvFpA7ucLqrjcAr_O4vMJjqyZJnPiuZ%2Vk}oCb+99tZCEF%>r>04P_H~}d z=zYB6UgF@Xm$3yAzCGyn`zuxEi*U-PAP&U3Y_ziV9`inWyPF`LvhV@6$lT~##lOC; zul?Cu`ycBW^e@+w^1ob9FV~N^I8!qwHB~6EPsFu_Xb}G}KmPb+u#bcAkDvdY?fUnR z7dADua|JxBLQnhozRm1RObU<*OSH8)=zK#U*7sYdzd>$$rjE@p*r|P1*WHzfA}9 zQmF^+lj+bkmoFBy=vUxr%d^=nE-|Rss#ca`DXLZQHcJ^IZkZu3h;rDM9_aJiHCd0Z z&I+N?g{eqTH);RzmgV^EJ&vLS2fPgok#%I*5FpEhMDAaKtMQ7SsC}$4O#8&qVV>4> zAH~o+%*-W{8{~qh%$08RClW3Q^HoQ_&kGvc0M(RIL&~AJ8DJl?hS@iA;PPSU6=f@^ zW_VS3=%HS3rLF09G1kM1*hNV-%VTGhD0qXyEB2xOSj}n>nT?SsIpR@`N?s~t6wfCM z8E*+17vy%7?=u^#H`b&yV?hnOmv`;*%~i9#`G&ytk~)N_gcWjd+*T?1#E;pYm*Eq3 zbfiW9yT1}(U7v;nr>LH zxxr0?XhhY>XnagIztmaG-(0Y(xF)KZxXSQ7asS*Mq577l@-;yyx=Xa$bfQ=qPEt%w zurHiwyk!`LsBR5S8S&G)_A)J!yq$6up9VYNPY&FuW`7$|MQ(^;OOa z`Q@q(uSy6`$2evIABY`CoQZL6fi7*soRfiUxWp3EOVFhGg4BqDRK zVBjf_bP{bag1WtGB3>eENbxU+AN^b`eKpLl=vIj3S9?ArH#vjrdhdJ#KXhJ&CC@Cx z40?NC2_W9gp2i562AHYt%Zl&zVcQ**KM&AxdhAnR8EY6AvS2xP_RP%_Dx)wyZITU; zPmzeHRl_e>h3~gth9N3CyWanF%_C(#IKFH5>>mF^DLpl`^K{Ko{qWqv+g6H5wB2vN z$En5RZOC|!A2BQyugNjZ!xbLA0#T6Cfk{xfDdJt=db|78 zV22v2In$rYj^8uv+=3c*Jen@I={l`8F=#)J@2lYTDrPbhzyDa+w8=3SE6+MLHH8Kq zMbVzUi3W|=nr9_{|L>B{O@%N*U9x00STYe`2h?elx|(onUTQXg2_X^VOaqi9G;fld z2>RUfKe|;M_JYY_Ke|;u|4YBe|9Y;|zlR)=k3U2|LYuIoqnW+whjqHBgPr4l;+|fm zF71LYiSf3k4Lu5h13@`v?rsXFlgeNSKsQ3f8Zk#@VKL1sI@UCiAY)-84UL6pHLFl{ z4y11mLI^1gUvVmx83`*_-G|wm4(hNUjTR`TM&XgVJ#gz@-g@p@{&jo!rTYy!mxzcJ zzbQC{c0oX?6d)mBmRylcjj#^N)~Z_+sxuBX&h@qc4|+!iwGiz&RS&EGI32t`Q3dlcys6w7}ekWTWrp z@f?*}z}GN;+$FSobN2pluWx`Q3|}xkH2xBd8n5D{v9xMQ#GI>EXqT#_9Kw9l9pQP- zP7+}6ZDylB6@HP<})=LcF<6Aj-wu+`!mv6YB#=PQA)h*{&q9Qe8S z3{D=pb^?9w!oy&5=iH&f@q_9YZnv%2r&T7fA^RQ6W)?USLqBnhBUW*%HL)himFHN` zQ4wW{C9MGI3KnWFEb?Nv(K{`fTw{*8ZmSA!G36{lo{iRvfVc4HpK>l#gTI`u$zMlh1>P3!U;up#yyj}+iE8%;q>}G=xdIRP78Hw(&#TJ|%u~6Fa7>riyZb}Z zvUUlJPPi6pPVg3C)t;Q|mNza+l|y*E&Nw!bIEPl1^qDl_tve+*tF>PY_IW9tghkp% zYJYZU^6_qD%NSd470EK{8oX89A1{>rvRbP?T-b|c#*JV(vn!&r+-j3a5uIKoG|IE* z1?n4+wpPj2WdF2D9z;O$iCji7&cw%P33xJD*{!Bid>ga~aYlPpp&kWIFOWFuYNybY zE_4|0XBo0q-UnNi9#MnjFw}J8STt}*yZ0I`sne^o4VK+>-q*c~s!7?6c01IX0r~}hWF~3C zO^W4EbkYr#@Hv&tgi-45P7^Ko1O%Q6ZAB4DHVTn$(Y&npMq_KDvg5>Vux--^mvR;w zD(;BXAh_zliFUsIY{NybLt6i2b}p1T$L!TTmn!$b2j0LOt2kk7u`BpQX%Y7Xcpc^G z7-DX6`5b~{Z}bHK0K&k=JiPfg>8!-IguHFSSQZT9ORPD*eO9O0!vA@5J}U}GpZmj( zQmSXTVTP)qQBWLNu%FR4y5KQjDwxR$%Ydc_&&m(k|Cc|yDQYRy(H}~x<&mZ1)vHWh z!?F;1UYT_KUu0A4-qD-GC!=5_V{8+~#>A;#Ez4^CztS(z+eI|sHX;R?^lEaqCXj9- z8bdoEL0nQjd zv#Y18{4+A3KuFDf8!VhT@oC{kUTf}-(c;5)hX@6JQ(jPv+L4PT@R*!c<|%Ln0yM*3Ifyy*XO`T73{ z)+$zZj<#lhD;FEpe|eybW4y~JxM#56se~^|K_MIj{!|{bkjYCVolR8Nu7JXzT&-Je zTOD}4LfLxZ@?0(v+~%1Hrw*awA9i_3;onS?mu;^SAUWwbznJKJ@c44D$@d3TV~`EO z9n9KKq2uXYcM+EFfaCV7a)Dk6wP{$O-kMIL%o_HU7Ij`sZqfQ9LbLtMCFfuUZmPX8 zEHl{G9JvgtDc!J(;Y>9_SLS8y7(U(=viCX`*P=HZWhCcqZQE z#{t?W&f`Z|GB=k~UZT%OTo>;LAmB-dV!t7YBk3V(i)N54I~#WwG`O>gQ8bP}6pJj) zG><=g!{k7Wy+pDD(oO#9+P1s@Cm#I2g2LgqGE)4mWo(Xv_=;22BY7POa zU6V7Ys&t|`cv!|QUoBB{;44h}8sr_~*Qnh}%u?^>%#r_OTOF%J_n%e+3m~U|1sp50 z5Rg4OrtHrJYse_mr}V%^4_*^SvmqAtZQLn?Uy@=<;?1e*>94v17`cvrf4Tcov~7Iq z&o&X0#t(^A*k%TrVBA{)-}In_q^Vz06lU~*Y|}GSHXIdG zR~EEE9b*Jp?U>)xJ@?D&Oxubz+?<~?wtV!1lMr{3@#~A(Y2iDK_SWd2lV-Y8l`)q4 z-&wNFzpb}lmI0S(%?bC&*iLWORWLbj;ar39E4*biC-c-b}BLc%-Gz6rSNK^dl>A+A5;G8sG5P zF7+h#;tmVT)P#wWImAm^Y1|_jFD4z|E&@@2gafG={ZV)GH^D{{uZPu(v=ew1>*Y3(dHA_x0nTEq zsbce>RC>=&hkJ}cc>Pgi(L-jpjiwjq4sJW&j~Y%7FT?%q)j4x^tJ&RGao;US;bPW4 zoP5nP%IxPC&?}OuU%ouv#k_+q3t<7eVow+@B4pekoRCroiwv`zAo4(hoz} zw(0@kGlK;e^F1U8jWge{-3rQ&qIYX1;&46pxhePA5&96eManf`X?u@eiDG|KI)4fz zLIxdZ96p!s3(Vf1Fp0EK>8<0QFajbQRNOVe zNYs#?*roh4VS3EoH^I@jz_v;>OQ<*g7JWaWZBCG5e*7$KS4hM(BQee^=tCWoZ!;Du zoI^Q(4~HtJu1OYc)R))<18eC;U~u<2g-zyl{Mp|eGQe+`I*7YyUq~`iLJWq2MIz-H z`ZHn7Y&}O%vt>@9T6XitQ?GWn^3KOZIPzTd$A9o2>YNBg&5!bP>Z7URe}3Z?{@;mc z-hYp0MQYLx^FkPJlnN&(aw^(QKNA^*uzJpPMDnV_LouYRl!}~W*=VApsCT;^ z!5Ia<*1?kxAcb}J6L_+57C|yLz)b7#Up{Xh?43R!=YVAnh(TNJaT14#o^ace<_Lcp zLPSK5H^-s?h|0*}1mY_&CSQg|N03EGP;qwv21`KE3F6Bp)(5 zf-(bkUU{RK1Xkg(mA-&j`JF=y?KGp@dSYM347N`W8!Ii;?+zC?8$d0+&|!T_IVzS z-C-(rJJSii@dg@o!EQ~oi*VX~7E&6x`WtXE8Beik$3cFgx-M#IIzIg|TOeef{wr5% zh-L=!U)8cnQPQhnq3x8m&@ReNEw(57QJib|_JeP$CkBno z5Fl1ejL@GLOlKW-Aw|6iey4L=?O-U-ZA@Zu_T=j+C9M#q+`9j2rNZ?OV?!)ij%Dm` zZQLK4dFKnmVWT3 zrWcT;ZB=~=NUT%!jc^Xjwpjam>?aXFFu%e{x<2FXEUgk#QC5zXwH%a`G_-$*@q-}9 z`wznq^nDY?-Y+R!j{-*syx*DV4gAAS+qF;YJOPOEK4KnbOq0B{JH%J$f7KoaQ+x}o z5MW?!|Iz}O|Nr$#{aewIr7SNC!GiKlW!+wsHHfyDnCX?NrrIq z8Kn^y=BeWCHZsbKtZ|!qp#a7PKC1((!zMq_*SE71;>a+^v3ljHKWu+Tb1aOAg7P3J z36pbAsj?@4L$ovd>i^m?A!LKD0b|-Q0}tG^LTjW9E!z(25I7YY33XG6Q1YTc-jz zvATVw538xd?QH*SjO(v`3dNtSwsCKaZ&YHS+!U3%!_?yOqm-k0DAE{~JTB zLZ}=aGE4ENFu7BFT;1A+k+nNHYWN#N{IG}kV2I7nADw2MkhMQ*00;7u(J3*uRU75% zF}vPX_Ldxz4Qe{ga!z0C%C-56h)(3^{$hw0{~1H{{)-`+|C1p~{>2be{!@nNZ|C`o z)$UwJCm_bi9#RtS5T~%3tN#W70ZaGfksfr5$k;_XB3B)|Dd)hpLD)ze6gPRu3E03} zeX;iMO&GhZG@EazJ=sX~H^cFjSIBo+@1u6xV{{F}V5~Oxn1lEFf}53p_?1IjJE0sS zEc%QQgvR*1-NONwLNgU^l!h@VM!vQ@`{%}Ay>9fLVdKgKmrYDdH@(D3TKtLr-x;FP zUknlNpA2#3e=tOue=@`py#4|V<9~Kgm{Ccmw zLGotQ45l*H)7|6t*hP7U*~y-F=@tQMRZc~Nf?xt0RxsbpY483U5dmS zOOHVE_dn|`evwyna_@3{&}y1D^(d>;yXV!f1jap$Z@Fambon*g+xO9*o>{-`M`IeN zq8}!zJUIvHannHWVrI18;3L#kOxNNdv}PL}OC!_3Vt>0tHAXwEm5Hl{Td=y>FS!hZ zRWx?J&;KVwy#Egj@%TS7#Ogy%tA8*=1gw}i@;cYZsBV*kDDb@x-%dfGKVd%@=P?$g zI>1+MN#8fX7W*A$xA*&V_lFstJrBf(j5*unnFd~@9t6Lz_9$m5BXT=Kz^rKN9(;hH z*uz`rMc+xBR38o)ljaH9V%G`+ctBJh8Nw!lzXDxqPHJ zkTiki;Cct#P3MPqZh{sSJ4xq1CC_AYVAcOML*)5iP7PvijfG8a(E!0W?hqij zyF0<%-GaNj1%hqdH9&B8clY4#?(V_m?wqf?tH-IX)74#l|M8PC_PgeK*0g6CU|g?Q z%I2c#MyHwV`Wbw0amw##Hm_sdp3X$9r&tt0MB`LbQCPs>Awl2g>!*+#9Y*d3WwJrU zU4ty5FDYkV6ouom>g!=?ux@;4koVJM4QLt->QC*8Ns5Vt-CZU9fnY+keaNUZ!)o2s zTcRDG_JtY)+efG~YTUxbnxWx|D$UWU0~_C=UA{y{wNPSGYXXc&Be5$SW4bf0VMmgM zP?X-}?V1)n5x>WuG-XE!LJ`sHELfth@3l%i_sj%+UEnaOI+&#%R`=V%c(*-2jibf% zbhvKJF^o3yK|ek2bf{^H_K>BN!38X-xSzuemGTActD~;--8=;T~oHR`(t@UyC z!ZtEa4J5fEPHeLf#(Hf)wzHgoH0Or4+09DWl_=5fhCDoX)M~#Jn-j_qys6?NGp2(vDmx9jJ2VJ{{ zXkx##X5C0h{s!(F#xMjSB6+(;Xu?~Yz{Aww5YK0}fBNIX+l&6k*UrxO56HbEpO2AC zM6d`{wupMZh)n8+65L8n6=r??!W!}c3Oq!TkFq}oz4r?xw&JBkH)VjYPD;AygcVL*L3{{F6Q#cpKO^VSWuT?^z!DX4L4EIvoOXCs} zcVjeFqt1CjaT_D^YOEh7c1a=IOx-HtkF9D%4A{09Lq$1nec21S9GStVHCq`KjH z3*Tqn$?9xq>4OUbGx1Ha;q%ww)i-pePm#d_<-mlnz=SA1WX~>nC$wi1T+o!%n#15KCDu?bp?w+m~^)u=T zfyqy9o7uC_R2Gnaip^hsVq4ia1;%}ojTfy*fs04&-0h58-)?zUfB$ZUpN5UwtB(IG z_lO%Rzy7PW;fH!>gkOab>z=INx1h>VFLV8!Ro&#Zzs5)7`+xhLjw|`}3-(YP?H6K# zGzaTW0km?Ec9U*ZeGUTub$dW7bAHtQ-a1d3cy-H^$G`PdgBQAB0>ZbJ6{7yU#r;Q}_Cp>7mI*03IJS{SN&9a2Q$s z-C?wmpHTow>7y>zd#YC$AR-Q`C*>xQ2(Snh4@RyWaTRdXa?+%+TyUZy^8)#X-bqRL zSt@7aRdK*+#2qEHI$YNC{OqWC!ozdiX_`==(+47^FPE_e*``-jCw!CJ(4dcL7HF^< zV=B^JaAzi<6ChF)xP9dWZHd9RTF7D9V zA2%wujwviOKT566;S%EKNC$IMoyDH@w{SF@pR{C?i*9^pa%r#yoyYVkmDKF=hQT1B zqcr}x-Wr!^J{rbAJ=`8WpD}!3{US;gT;;#cWAA?GpmEJhJ}t%Lw1dDeEH>pumtHSX zQts7_Dr{8#c$PqEwY4b^y&+UL{F3RSQ)V^_vtyuYE6g-gMH z(gJj26&WM3?y|5?*VOwlX4t&QQr(R1sw@RREp>gg&&$WpbcfBNN-PTKBjDVOb3A}| znq#bVZh~s=-h!fFNcoxyihVf|nuZc=L}14)7s_x+IP33(uN*`x##)H7XoOzj2E1CH zBs$+*6l-%oBCkP*ydfg5L4+hB?&t1tS$Ov)*O<$duJQ%OhCQNs8V!Riy^NGe$|wb< zjCBLsB3`S$%^7fRZ1Rq|&HRfEX33eO=uQk$LHW&wQ3g4oQ0LkCNSm%$(X_wWiRAW)@1O9e!aeY zs8eXqq)<%uDdrc*a)35WgwL&Dw&Q%<-ddp1NiWL#nr_i8IN zPIg2_T|C!$!hA~k0?=F)Brr<3r_5NFZI*WcdlgCJ4j)-x`oiGSRoaWw0&THD1;IkJ zYE`Dbw~Ub^;DlB4qvNksf>48$3c>$Rr;+t+9fx@CV&hS9>t5G;{rINxhLSX?9G6ChGGjrak#93zF9t9h>2Anb%?g2)Q7%f1! zBxy}DuM+wX!aOGR72bHLcQ|eXE#vCN1SogBewANMZCB$28waE_Gu2XNN*A`F-s$A* zN!F|O4rn9vpVA$-jQacO%9v?!rLvmV5r7sNeLJ#LD$^r1tWHzxgWMVhP2xdNzHkU{ z^sEoM=JvE$zLDK$R&+Hk{bnpoxhm1;xT0Rf<2Wr8^CmEFkxr+D3-`^`GEi1$A_LF&=a?csq)H{T4N5 zF!@Ds(7X@et`B36fy3e~rI`krx%X8W$yIVyt{-juf1~<*_C!0V{*J4qQBbe|3R^eH zH~4d*RwQ5Ry4R_jt2#8??mI-4iRx_P(iO@?02dx$|F9Yy2@;O;AXbCzA6X5-|Enj4 zx`ng3n6-ud-#(^%Ratd3GjyMIQsX$zLy1_V@OkhC$*O{4|M@I2B8lY>^RWtDmA{Nh zg(>3GjeDqGA#@wUZI^@6Y+H+}zl+QB*)EIvs>okF%b^DB)gjlU@Z5LY^WUsS-|ts; zer*Fs9^~%DSg|*3mK_|LyM7!?(WKQDo2tSeW0G#*oRsz;Vb`V62BBE4bb)e8^=Qq< zflC`x-IYnhB-6@%CD(G!A4i`U9q6hj%;%DrFOjWGHRl`RuZQIZ| zcmzU($zrt}%;8jtTgS&+)0cMUYGXyrI!NM(pdB>ma?o4d&!}=N&PQs$3Qj$HV;iI! zVzfD&gT2Ka*aK0#1&d+8;iGYEgI9P}3k{d8LWj0$@a%%qYw9f7suwt1zw+l`iLnOK zM@(HVYQ;_;KDuGg*-qEV9^m$#5{%9qLEN*&?M3i}pR9xnk=4xy%~G(a_knsyJXje221!|$+c z)#CAUHaQ^DkC+IYRXCy`O)Y}{J5ucN^HKx=g{yCEy~rTXG4k1)o)R;I?(yv_)v>NGZ=t`)StS7(EV;V|(i1z()6 zCCXtcGa@kn+X~Nm6cZPaPA*teN%V~8_+9$;vXq!q7hRC+mpa~&&&Ml*ab&5CI)k_u ztP&%4Ji?BFp~^fa?4J0{Z{lwTBDil@pw-V zqhBcJ-O^mhm4}Oyi1cFeHU`AphbujMg>-oY4~Na7AuF8z_@4%y{5*k%k4J^Xy{1v? zYDxTMun{2r3=S1x{6NByonV8(&f(kKz}$>r{=15fjmSC?jkx+iPN#t(o-!%D9my-X z89!4OAOA`AV-3aR)?;_jUni4uX4pQ<$2OUV z-AF2pghzI#u;iC4rp0c0=tJXH$Jwhr!2|$kAf%!|-+-0>Z;Xv<{Jl$8Sl{lFC}SWUs&}dip!+e;QU)*?`7LeF{E1c}JrEUmO>2&z z!zrx1&i3M z5(o!HLC6R5#e8XY;RhqF%XC~-Y&JcT7;G92XgJe9! z2eMN`%BW-5fGX7otJ>i&8$(UF^&t(2UdA64FPaGkBeM}x^UMC$OPO@V z%IZqR^Ex@n$*@8gBDoQUr@7cTQt6Xk@4v({EN1{?mS&t85cZUrMPY(KOX!c={txWC z{t7&s-C(@KvK9s~`&1f2c&fZ03s+7-NuGq^{;tb|I$p%HaT)X(C+QB8v%5mT8LxVj zdldxFV^O%bZKOql@A)h^YK!0X9b5p(mu7VBqluK%uv9IjDotfcHutbp`rqJ4Wb&y! zsO9}w9c7wR)p}${Bt9F&opxNEc77XJdd%YvOH#VD zr_N8+QE#*$mjSWq>=iPTBo?yK#dXCnqQsiH%wot!8Vhzs@scGdmSsTgHKiT!pjr`0 za@Byl6Q}u*XY{BCW`n(`ZV6ly3xlj7z^m6*i%#>*+~| zxXBvH8`Z)T=g#ynr3PyeT=3lpv}BHW|LT!(qDy8`3?{l@NNgRTvO`7vgx*`8_;~<> zr6_N^TW=0mx(})@!IW$ix(&3Vdo5^3w~5TH0z5U)O2v)*fz&vUl3cEnGG}6^CF0-` zT-bs)EyG};gtow2Bg*YcvbyuL8KcgtT}Ap!_|M9z@tpu>{HHXPcJlk{f>@4c_nE%5 zedttI!mWfk8%156GJ2J(W5-q5`h#ycCk`_~Hf>O$iP0uyJ2Z1`n4yUi#$|gU=|8vG z>KepZX3>rwLM$_s#GD<%DRRR2vr=#~SHjP$*exm5mh-A9jIm3o2;g2INrTZWSV{=y zoa?Q4G_?W4-x8dy_t}uLeA3p`ZwN46xO3M>7+A8r;eFwzR%LyWj5r*8C2R3#Z!&o! zmo-^eg*Vy9usd=ZL{4ppo<83#-;U+|s2tW4-!x-g3kaCuNt*JNEvFC`y?yTI4+_zu z-})2=!=r#xRGKPmmF0sOe38SVaMTul&J*6#X0POx6o{A`kwRUh;Ly$1CpXGT9kH8h z#A#dUApG+|Y{)%OKN!?r`b=K#B=~KH6XgN25Zm<1xfe;O$JT%`Frxfcb*9k?H=wbQ zNo3>l%p*N|)QFTBdX9%XJlszcyO!}F=FJG@9LgXbN`T%FX?wTwD5_q2L>6;4#7FB%^> zHi?mFJu022yz<>)8Q{0_-61P`6cOR(5VRj4nM(qtvlZslxeqRv@ps`|y?~aAB@qi$ zr$0Wr2N-T6=W?8J{&JV@3yoeM;K}O^azm+iDF~!xwk9|sS-%e}xcV~ni9fyjl6PLT zjgYJGN|GyRdj$hR1}yW0YyOlh zv*fNs__%`%wkA~7kzbF=Ezi85drln9qp++fYL?=IPoFb>dvewhXU?GzWd;XzBGS-^MfAJ8#ZbwxR`my&(0WHW)`WTjFU6xjmaTi$9S^T8_<@w(J!}8E9_@ zn5y6In$9>!q*|B@G59fgXRfIu&E^$rwf?G`E2B3J_S4eP;>^z6E?SP4ony9?tvwsI zugLTVr3Zczfrephv8ScA?FT^ZJKT?>6)|<2k*Q7>(vR2$@>`T!fPmR6Q;ko|5k-dH zh0>gZn_D#gqq}fNk++z=XIs=F5=-8;0o|<`V+>f>-d2xiiPou@u8};9RRH0v?&7+M zbS_!hW_WyJ(eRO_vpOLRZ&q5x4L?iv-%!2c)ekYBnd!HcKG5qV+J_p>%dF&th#6gF z_)H|!-Q# zi)cjID&>NkSYj#KjGLk?DNr=9AKXSNwzVubC18HR_6iv7(2_5Sv~*Nn^K`_5gN3~RGyj2!*r?1#@QA>owDZzPWx(9)W+Wjd~CvtdI|x;QlgwZ-*+X%qg;2flW%ijQR4O?V03rgaL&HLY%*6M4=>cU%EbwE zV^-i3J>jAW%tU>`NP5u@JT1Jm9rTI9wzpwCm3j$#uxe^*FP-R+v1_&o`dHBKHcZvd z)q}W-4sj(V^VP@iM_=MWimV9l1k-z6I65$R-3^v0h()77LjB|M$H(i+M$y1Qrj}Mk z&n(yoZRaO^@5L?e08+D^>z7-o1us4wU3`_N&aOfH3A$;=+eznbtWg3YQNuTw6W_s6 zJjkKmXlOowur83udXh?}jJZjE-p4!48v2g{nAyIuMIFSkmfem?(AG82f*xqPg2t@% zp!1gkh_@`zu!NGz@GYBSkUcs-InS|CK|v}5Q%dUBN>7y1b^WD=2hd8swH_aftx1ZO z0!1|9VVyJs#qcZ2lCz>Q^Y{}ur~Ddb4uQGZJc6#o`(GrFq)R{!B53O6{Ku)6?LQ4a zN+vc2piPY?j(g=nCIs9f+yb@K-(p=N47Et}5AuLp)i`L{Ycda9iT}%W zurfPU{Xbj>rsy#^cdK6KToWGSBkjH~k0;U}oF2l6Y%N{eoQ?G(wUS0+^|)jYGJjpjOq=j73P%U?EUQ0h7(6(imY~f z!3vt2bi74lj;#6Xe=M7(;I%M(jQeH60kR$ZSe44?uFY7{9LqCTEOpX`N;17<;|zCg z`Vv4%L5~iKE~zo|fSNbQb5S@w5mj@G*|0H*r?y^Abo$5$KQ&Qrp_*v1TaxcF5rp1F zxKuc2CEC=qN8$O%7^F&s7jd<)7E46u8)~;SCx=AE3>q?wr)IO`hR%F{9{kBUwrL}< z8luoBQ!lj|@a~*TP3EH9n2dd%Da7%Upv7hi+>AGMW7h&b2NH(^<)FBY#0b^yvS2m# zid@LMUhrt?nY&(d8V_=Ak_Ip?aZ6M$Q@#*M0wg40}kF zPcMzhNQouMPfCe#bSxtogz4#yQZrqM8`5~^=pJ@n}b5LaPidOm*5 ziy+vE4$_&Ze#i?)4-D_PhjG9$s}lMXUZVPAJP7*}UUIE<&ZcFwRR)EZDtrH1cs04g(SwW!RG{z@D?hOn1HV{7 zz&pgB@Y2R6B@`&UP>#eE!|Vu$G23(+fNjEp2f6BG0iQ zMm?+oGfZk~t*1iiwhjb4VOH`j?LX1^K(JGYA{O|tPMkpmf}J^M1ykm6Pj6278O$sk zbM<*xS&56kU?+Dd^2mPO*|{7wxPcZA82N=&R>L{hOd)tqFD3feQ?^~VAP|?yLe|6* zql*pnLO4*uL{Avo%cty#Wf?uvH^dUn7JOJvAzLJ2H85hHE7x$|IEN{Jg1Dgcm2OXF zzYZ)sFs@<}uL2+t)n?a)alkTA%Q|63QQQ&;3+3M*+d72-fR*QJD}h_@*{R4(=RuzJ zx?Q}Oj#c)d@DcZ_A{v>gz?ev%;*?MC+MI-zlN|iu&4G1?_w7Vm!h7g5elYkbkK<7h z_W^p^qSS~zPfJH{>tVl-S&84x$z+EX`8f0s4T)XxOi_$5PH7JhtH6cp8J(X$!T#^x_X8DOwPfp-uOiXkWF zjP6Dn4HtYI{Db%VPtVbn!5`G@SGpl}taF2!**)+f7?x5vHfxqD7Mm=0xO;^KJZZv> z+q&<)$>0R|DMfS&j{F!Xyndv>s9p+Ls(zDjrhX~f{FNrrfd;5Q0~0=Rh?67>rvUu6 zwF~do$~6M8WUClz$Qj0V?mCFYE-6s(u5356K2RQtw2Y!v(<9h(^ov~FoSxHz%z+i2qax5h(R-?@SXe4OLm z^P6Aw8XNI5V%|a?rt}|pPg%-dpqJ)7s1qgApQI7&`0?63E&IwAUdLh^1uM&BE2BK{ zXVCt;m|-#d3xdEKjOS(FTj(tJ$M1=%vMDbO2I@u9MNS}lw<)9ma(m=WiZBE|tx_$X z#sKwse7ONIFfGv=Ci)JyoO@htopwC7J_KGTcTXjB>QYPKFM-;4mu77SBxX?kqnN?+ ze=;ro`F#F1E0wES{V9N4;|P>N4H!^CC&Wn9i2p1mXh}l_3C3pgVdRq0+$z}kd-pFH zZk8|A7x%u0@`uOJkr>N0%TLV$C8Y=J03t;#Nwr$FbF1+sw@jzI_WR0C-)9Ixh7Pks zCKZb2rt_lkd~YAVVvMjBEd>N|2i6&6LPt|QS-Db3C)p`7Mquy{RTEjs%>mMM6&09>5v`r&I`|LVfW(fsVe{FGI3b8sVLEPckCE3hrYgrA?{DSU!zeY04zI>@z|C)OP1UI z?MTnyOKLf&&29@=3LGt`77OG;;cEA>;vZT%s!oVYVh-#f^lf5+{Ta&AfZS?a>7{B` zBM-)PdjLc|Wp0b%N_T=OWnwcc4wDT@jA#F}Vny^Onop!NfcK>> zibI$)%t(i#&h-<;!y(;pb8SxSIrtqr8gLz0+q20eDPB5pz*4!)B~1gzVb)$mZdQb& zoa|2ZxVP+VUAL21MH^$@cMmRk*X~0_EW=hE|EKMu7O3u_D?#dEK!Z|9%AsQY zH(sA}agL3PtBSN(hI8mMkXZ^3ox<|3np?4B>P>_lq%b3eEqWE`uB5KaI4IM|XbSaa zoLwGR`xoGpxV?MD9~B{r1h((++r$Gm@^cE)&|wI7>=?&hVY1K)hn}TVe`aUA`*qbPdf|PRjP%M=tC}4&@H)o zbnB4aviPRH8KNbl^5HdIqZf;`-ctby)VqlZWno`epE59Y_3x_(UE@%g9ReAxowI2*~@(d_&KD%{k*-P7WPpYpnW|c zv>{4c>-#BCx{4V7fjJ>bGJQ}M&L$O=MH$ToXP7fNCG(bS>%-CBXT5HsuU)DN z@EvIF?}UFYd+zR53K7snkBj*K=CW5dw=i{g8CrLwqqVdkr1)B!!HmIJPd<@C?m z#lIf6FINW)oe&Z`R!~dRy3LN;$BAm?uEco1fyE0hBXc^v4ZNar6-PCm=BKTY-!?G1 zusdizSq!FHTh9BXH){R1Hjqgel`>VqQZMzXE!GsvHSsI~^v>!#gMk5g(0X8DQ1qi0 z=@7?2wH)Td-#I%iwJY9IsL>2GuzMA|xS+C6#$tXl26)Ups9`boBX55FSd89ygZD@W zyj}c86eCpJ)Qwz&r_E9`khm_%5oWV&w(oTG;LdHPomOsWx;_jOtbAvUVBmgH=uXUgpx}d&?QDv zE@seCV7#Q5OU@Mga?=^DkZU!9IE15^D@l#wyxO-#F|h_{(nJG50#2$XRIen_It|1> z>f(qIX=29q@bD&T6Vq=o+YPr8S8QUuxui`yAt6}S>T{Zmv04J&M6N+^Su562G~fjq zLoC;HYR&%ap6nW5os~&1lTPa+A;-vNFOR1{Fo6K|`zp-r$2R%kqZIhCJ&gqWo>D2O zB})FT;M}i+W^8o3xuK`{ScRpjrWLNvxviMWPS^CRT6~9S zf6Z-yTk0bQhU%GGZAm3wL54J%D>CZ@%>H&dK=6e1>ybD#Xr<~4*b#MSz62tXf2n(9 z+nq$q7aHFjo6+>`0r=533DjQUiMW$(V}anuidR(8-PWlThTkmfo?wKH_XvvuIgN|e zLg13}@?^Oj;t$|H+cIrR@CzBja$~&0+!#o_z1#5wpn?)l2DEK2&S0K|C0(T7+>efD zamibnQEz%lU_uAjcFMOV*Jt+osAfCxFPEqbiTo8E^q_Jd<+`W?%ri%43!>j>(}fz@ zCRgZIz6YZRABIRGe)9vBqO(O>T#&x@KoP{aV8ijBZ(pDyy{*1tbhIy0_#8Rl^&dRk zQZ=;Uvwi+qr+DY;8qhhF)EPwe5Ju6- zqKYj_{t5SZmDmXUS72K&X{>(|H071T{u6fm@9VApyBho#b|_hxnLCrJ+B#X7*_!-) zpGUsRf8*wp0h1O&Op)XTsSS1D#rf5e4F0i6ljvkwMEXYCCf_BQ9a0RKgw>RPcVi{L zLH?oV8;YfqEBK#tbUMte`4mY!EOI(~M(y`9N_fTv_yWmVzP;;x%h%2ncu zu$)V+P*d$yvmRsZ6J07RntI7-Fsig_^>VG!*I2H|RwHEuUa&k5`=QQZ7;&UBF%OzHFmu&1yhXt&E_GxxqA15pQX@*3ELz570Wyjg}&?V=1)x*F&qm%P zL*F{gXgc473L(wnPIun1XJ(K>zDXWP1sUGR9Hf%bv&N0tTn!;=SA^N?Na_8F6sOW? z9v*r_&OJ{D;COicO+xtxIziK=;nrLLUWU;`5klb8h_u+QFb^kz2iXclI-tX zWcp!uJau?epKW1MYCF@3Xs zyf)3%Q@b#4N!9pl%~6!OB`4#={NWcBJ<2A;XVQ9s&CIO}jI+Vbew?;1YAba-;&Hwm z7A*y3w7urox0N zU+q<%P?oE((Fy*3o>&(7D(oMweBJfI_<0|6Zad{ef;s)5IfE)8k3TJ4ubdF~958Y7 zD7IV%b%n&;<25bqdxwH(dHdHF)P;+dChlbrKSn&?pi`(Eb)Ff`JFtyn8{6a>IETe_ z!~enOJG6i+)2$o!lLM&p_+k+HA*PORNWVPNH`@L3V&KBw8mdO_okQ091^rQ+G9*4{ zZQFR{6&jx_jdGVmSJrxJYPDCcd?4s+&~;Tn*3eaQT_(}d=O_x)TFy||hrzZy zqAiRP3mRp)nyu*@q(2i%Zw)5pB?x7h{*eY_|4+Xs{|#mSHlnou&m+oYihhVi8LaB( zdRChmc1Y#rz|T^s2(YPYx$xF;vdOwoNfE_6(C@%M)nV+#xifMC&$*u_+CTdxD0bmI zb~PWYJ7wJX-2F@VLnH%Q0WC#u#FJ7hF~Y?a%T?y*;w&}7@_zu`DN{t*Qr8w-%Mons zHsZRleTF_!21}`^N3@$y7bR~0@G&q9uhw&+&A)V4WvX+O#gbi>Znx>oyEA}7<%+8vI zAf-g;t9j)}HFa%nQuxbM+K?;%LI9q;E~F?hpIA{rC2Q{60cgiIiycc59-4hpzn3Bx zw9ZSN_4pnVQKhtIE=idd3r0i1j=2;avegeW62c*U_`E}0z+1J&2dfMi_qWAOh?!Do zvT2yVfwuG;fpS<1$7z$dg|9tn1<+)(|0+|RifGqxkCE74@k?^f*NSuzK2PUzqz(+h zk{ea}fsijU9^F zrQdhAMSLKCIBJM+WBer#pP*&+HJAKGYyU_rG|02Usc~STgiCY*W{?0*Aa7oI*yJ?? zggZEs5c#O8CHaRXmS<`G>1uPdwbu+shaKad7b6w$q3Ib%-E6Q(=B=L`$!$~+hIJ+K zJaHr$lB#-;&uZ^b`Asi1_iMC@ilh?57BsX&yWuBcBnBuRX2V&T0SD4&Ul?`Hiva+m zpX}PLzCKxSQ+knDxBEp(M!T!n`CDTJ3rauoBIwprEfmD>d6DdVaHvidy^s8`R=ht{ zcog>&UbQlD#<9#z7Pxc(9S~{sIhX>R`v5K;@vzsqdg*y%_C=KQ6arGzvSRwMg6%zTk zQy2<=q5pIOoD>V(1Nj31MMlSyJ65uUS9Fs_&dWi$(bGr5wt-QGKBm)|PU$vC3I0HP zw*pnvHh?m2OSUzx41z$XKU%R09?^WE8tu3D{{<7scUL51^y`52m2f&^v8+!qj z2tJ=PU7?9IXC9!&b4D9H=nz=4z}hL6vc}m2(-%E6{6Q^)5v4#$5P9GGkJS%S|9RAM z29F*s7<%-=>y@KfJ$pw++Q}ZS5@B}J-o4*2x z&GSF2@TquSHb`QwwX7u=liX&ug+NaQ5N?WxRx$ol);(uW1DB>uN@nU0Z>cZp>`N4p zy4zxIGak)H>Q0RZSH4Yrf{@K5am^aX#}+>QXtIG93cZyZhP!ntK#Z(a3ko9bvp2zs zGuH$L2*|l|Y+h17AbBt#vK$!SHo>KYHn-e>dr~jMN7M^>i~XE>@AwXtlma_qp0vL< zecBW)kY4E|SLn=bj?vV^twF-ys^NU{m*i4ISu6b~Ue5H7g{@-$g7|>znY?jzHPFj0rf4U^7pjehfww5P z|2QH*e*7}a?#}%zAV;bvB0RW;LsoCr9G^2LoaeS$^`SoHj6MQj}<0B$h zL8e6FHx|`l<6&5uuXST>M-S7Da8Y^^Sj?t|J;_Jmxzp8QWZDci_|&`ML2>a+pFgU} zj*KuHNK>R?%gd%&YzXFdb&x%=Pm)enOSCKF6IXFGPui3iFa79aI@$vs+D!fee5ICL z;ju`rNvd^O{3S_Ya|e6c%#a!jsVsKzu#W+pB1ZOt5r!xS7n{?{@-04<)2RFbwfqrW zO6%jBpCNmdC(6S!F0O{~rK*)*fHb7_qye`+F+r>SIG-6^=YyS?Fw~t1Pe@Wkm?IA_LPevvz25D?g_~SFHy0uiS&TOCJd9 zw-I>zTH{zKy|9Z>Zw(5==u;dO?`Y#2>Z^y~Tbp4=8w$f)ER#$&AP4)kmvN79=pJF| zxF!s}kVdHdmg(cat=q;qH8Y^s9yR5DT$IXo!nc~!LPx!i+-zEQ6ViWYMooSZ zxDkt@wNqMFBad+CmqVt2Of{}HPll`zJ=T$z<{)bKHk`e63L4GZ)1=0@7kFQ%OXaZQ zl1=J@Q0^@pfP_jqpoo~^obgZ8Kg#F{B;NG!!~8MUVygCZT4*;Pe;GqT%QDGWV9zh| zodKq7XyV`}-HG3HufLAF>DkXx-*`e=r@Zx$#6jdpQePgmr_eos(KYXKb<%ld4$L<*PZEw+e;E<)PkGz%fdWI!Et6^QJU*e=TJWbpD+b#o4oy{ zzLfvh)DB@M6tCEt_GwkL@{Tf#gf7HjlKCl#b$e*x`pk;d3-GoF%X}cYNv1fr1_i|# zOe>67j6;cmDZ_*vQ3n|$sIyCQM(@y)mI%~0>)x89|YJ7aq`tZr>ZN`XZo zQR+l+b1Ef+UyZ81MDbnhoN6El*=4aPKvru?VxYInUX2%EXQx~B0rWn#`rOOCtZ|e2 zPHtq%tbbh$=zOer$&Gb(vcX$sMXfI_6jMXe>lsPSBhdLit2!TvJ|2UfO|MlCcq&q7 zBF(9Gn?!FydDd}2`T2!@U}MEo=(bv_$BePOd0GTa{eeYA)5Q6=4bmbA7uG5cSrQ)hC2B=s502Hg{N42&0j z(OJydu&|NSioUWdD9~ZEkCRV-n*O%-z1bmRrQM=U1I61^t@b? zX_m}e{VeKsTMYeLF|m6~n?>K!&2%d;YeeVnuANql$JT~y5{U<^N;z=hnSjM~)0&57 zoR=flT(yt^7y~2rSB)?E8As;b>RN4+nAX56U;Db4JU(GN;ES3n{YY|8k1a68!zd(q zf8^fm0A3WhWJ8EA%Bl6^r)tC@v#pKv z3{NxsG~j^u4Lf^BWi?kvsk0?E%%eE3<4b>=-i$p1c1NR)Y_v99sj^)8JqOEsVF)9D*DcX>Cm*#u8Glpk`=a}kWU>)pRfDI?3 zKo`bfnKN~icLPAH9gf8>one-VS`giHKTC2=sQg)CFEg$*yVKOgShe&BJ*-=Er1aBx z@yJEG%l^7Dfp~wNcLDF4qcpM7*8?kC`(uYZYwAZCRH{>!et8#UnizjT>p>psjZGzW z>b=Jt!th|FLt{_c^k{Fth$cN{#fq$_d{P4HSeB5i_OeOmT3INlU6BQ?Zw;CnSHu)* z%(N?mXvX2T{YV@f+CHX?g%vM*>gCh~&@otDiR~%P(()ZVuUhx>3u8L6Z)nO`$yf1QYq06eTNJ_E2?(y8($!VDP){#7)fZBvfG0($Cmf|efq$Ib)!|HAn7uL?*~5ep}K z17{=ie{aE4l$Guk{8P+SQLcKT{+pJM(m&k&QsGJo1&)pYZoToBK1V@XjCJ@`;e#^o z1H_BsHaVP9V3-RMkDcjynt|#1`d2-$^sVocEY^FJwY;fMKIFei5j}bas7pzdN!y0Z zxax+zuqktQEHv_#d;OO?<}J#~IQB)p!;A@zB>)nelN)ot^U+iZnZL$l?(_CM_MEqK zHLgWQ?1`&aOL0C1DCj4C?wAc6*`x3=^keJkkHh#l54+a}*gE$0!ZJrK$xKmr?*Pxv z+2$ODnGk<{B=D2UlcI3!a{ct^#y!U_#r;YqH_4?}_GA)@FO+KrpjcDLrz*7lZon$b z+c8Ddx|5_J_6DkB>dz1+t6TLw+y-ZxEoEb^@{jhW_))QS7x> zqyf##JO4N@i~N^=u)i@i<*M3tf9jRV*WGu@KfCM_F}nstDPE(l?*i;Q!pi{R`uZ-(upb$*$CBGq2n+bu#EU~E*6 z!V#Dzsyy`KB`!b*?OtI?UU;}jH>hcw0}_s89rJA}+9Va3skpqEj0PN9AXiEy{#0kH zpw8*5YU;eKabmV~)GZF31deTb$KzC-4YfCkj*hb@VEUTlAqrplez0i*xI&LH*5AA9 zDTaY6XHR3h2Z*3XCauH0)%&X)jJ0=pz-=OwcJWyQR@P_%N3MQFq;nNWDQi~MYCUEF~BM)jpDK+w9K!e?{oRFk-76EyP4a-H@H7dL6Ygk(>=V>QSO{+zh`a!|dL->0SmDSTV^fF13R|&!C zB_usK`M76+u`A~}O2jg>aHv1`#6GF@`LlkcXh3z|vX4q{INS)9Noy!f6g`>Y6y5N7#(u!m?)M>fclgx?6(FqcL6%xdG02M3an zuJ&}MQ0jRHd&BwK)f60|FJ=dxSwF9mr-g%unP#eCIfNpQ&IXwFY7=inx>PE>z`xFW zUZFiHp9CSi=;U2Yh%jOb#T_t6?>cn5ib->CDe+QX^%A(7{!aVCuaZyRi z0*|8{HoH3E1F3x<^JCqS5LH{3X?-*U#+HDJ0Y#WtSY}>YN+pgHj zifuco*tTuks<>j-P3?2;Y3frmyx*80)Z5+Wokp@hYyAV?ic7KxBE+1ZPI zjl-6ui%5jk+BWrhW!;``n1qY7mNV8=df#u1xN30Dr5doYadym2(5Ayfo z<}pv3`I$1yDlaU@Zr4!+Ek&9E+X#)0fM@ClBgTkK4ftIbj1nwLPlAC#2#w6%5O8nG z2v|}~$6~x`GC)Vfy;Xjmj@N+wPm*|3_S^W;S@DmALC$5HpJ1B+wAYUJpT zda3gk6(n9^Y+xh`{&ntOq(+(y231%2Rwk3F0m zfn#C~T}`8(xRlNXz0m8o#vLNE*ea6jCYZ(di_zGpfk};mAMkUw&^wz?JNZof|k(bM?65mze-vC$p ztfiP*@h?LTNfpK6lBI7Y6ZyU`Y`HkZZtg z`Gl5Kz>Stf7)E(vn7-2MXb{cq#_c3~Oi!S^fqbAS4A^kp-sJmfr+@}=W%BmXsmxDh zr(?$BiI2DYdk8-UW6aCdVzUD_ZYDhnbT(K8&H9OW3(pOd=t@>-*;(c~Ji3nT{U-Ht zbxSMzS+uhNEl$k-_EnXxDY%GrD$%v7#Q1u+I#N=UkRoyVhDFZ;q7ixran7%kuq7Yr zU4%09CtcmJ%fH8RN>Lz`qA$|yxW5_z;y}oMhQ`Y1We~WpP@4^EDGfUSax)nkjF0Lg z=5I@x`TaVosO18tJZdXcVNXZ{9J=Efb#AShE7S7c4hb>d z?D(Q6;3w=hy7}t)zGVvN34Q2W#Avs?mu7n$0DkK1h#f*&i6-`1_i9iR9gIWVW?==O zWC|lMo5?kOH~e*!TS`|rU0N)s;>R(HBVi4<=+_wDt!@Tv@e*qD@FjLXpGKT2#h&rg z5*Sz`2!^V25qr30A?Lg;ee=i6NF93_-Qoe&bt}pxeQud`(0+C9XlD(7i(I3X3u0@O%SyUMg#+F2%8oOTuZbGUhDc zX2%UQ#Rm)_jaoye>b*Jc_*$EJl|?!&-b@!t+g`74)J~R>EgAe^P&Q>!*dS}|CT#QF z6<7qBeHLpnam@S$UVU08FOg1MC!fR&oo~<-k9a6u2=BZf;0)u7_R2UP0We%M#Jc7E zC8s#0`ShU#jdGoW+lenJ;3r^ryK!4Kuy!9JI>VvPUlCAAMXd^2&bb&R3kJ-45j-&+ zSzyzrd+fmg)oH~F95ul=(=DCLzcC~`yPFR5gHmP#P2~fVd0Y*`lzKLQZO;XFar>ATNk>au?K$ z5O(6QwR}MS1ZnPsjm97PY}`LqX`cW4D*d;9x+s4Ab6)Ui|5n;)!ILv>)>#7yej`}3 zhn1J>rf}2OZc}%%bU{k2Rm&S5vloo8BNUdPDS(7(1pIuwo%Q^^e`5S>p2-i68l@?+ z!M4%Dq;dCEMr~1u=4?*gKt*2@M|Vf6*)Z7ElQa?*hO4-$mMflQlbqR~^gQev9( z_XLac;r-#Pz#bp0<=lEY4f~8SB8zCIc)MIJdj?~sZ>}a zCdn#kw<^E2{!H;ncH4^8 zre#GCB}MZA{zVKBKZ(O;eVKQ7=g)8&v!8mY4x7uwI(VVA&*7^vZk&kI&_t2} z8hwkb(?z|$0k(-r?u4vGKrl|f+F##dQ6%)pC^IBFn@PeYk~!6HYQi({v@>sN0MQ{| znm;{xeSWlT!H8)nlO}vB2dz!tQa{?S7j6oKzFMeTlm-!KJYdU4EYe!=|_ z4l=ry`(TcK6j7uPDls;xL1?9fTYtZNxx7w1j4AziewwT|$N_y9t4%m8UC>s6D}Y~{ z)xYbD)!=$pGxALuDi$#s_++G*e6sBOHR@o382_;BeL%QAc6|gc>fO)u3^ev*YIId+ zNLSeX;RV_Qa(;AROES-hhNREuZf*2~)Ui+_*Xqpr`pJ1lseV1Cw1YYx)l`PjE;&?% zC>XZ;0RNLA#!DrnM?T-0mw!BX|NA={|Mk}VJu|4jx}vBcel$t6NwhUJ8u~Z!Qy|SH zvUZ^Qhtk;i>96JcTMEqD)HOtm+HP3q4nBfxBY1VAiGcFpA*kAjM2}5>V0;k$oS2L! zwRt08I6mkyy>#tvWpXwB{r0-N4P-sU#@liei%&^vY#kSOM-+<6hAkESN*_jncgmZ& zGut0*k)9C=D+D+dL#fl{?&}F%8NFM1Q#j@ zdA#n)A_@bgAQga*gd0E*LqTrBtps~5OrK)vw&}gpd}xQT5D`?;W^0J^G8L?cFGaD? zj03wqae$iDe+%+Zgey@oihs~-V`wdJ2NY=TnJRuNN+eH_u@ASvu@ux=k0Kds39~tS zHU}M|VGbB>8Z~TY&yBk23Fds#)a)1x<;8zW=kqGJDYVp)9@%=5N{z750wv67+M=Fv z0BE!-aG@?p-@TcO8`_{eh;Ol_U{QyJfTKV_1hPXlT16=hft)cgpUh?N?P}tP6gFs^bai zS%_&pXb0}~HbaqxMWr0!*8x2`Coh32&mQV5chcU2TXBg2>J-mD5hJImYyy?K~W+a_(oL9kv~4H z6|Na|^K#3P^?JW|lzj_WMh&W!7&?RA>WK}&vrcqS9m;@ysZkK1W0gG7tRWS3U@R?$ zs2Jtm7b{87Y`Tt2rkk?z{N=$}q~SI8j;#8Xwc(U{Fg5uns@n2saDh_cQC1f8R^R$Y zN5PIx$FS#C%8h>j!cANN(13|o#SV%WNYMl1xoK|ty;M7uCqYR_k+S9AZwt0qi z2cqp#ip1qe4|S3f3F4--Kf^|U{qk8^^VL)xtDb&Au1 z)_+uD)UnQON3VZb^1?MhAqc}&D>ZUjt2hq%x=T1!i1hO` zRm|IbaXQwQ+>kjQwNOp29-K3!R#Rdqv^|)I+b}}AMd|z}nGeXyey$m=kCjmUwGW&- zde=Dfot|G#8+dKLcJ?5g^g2njb#Ta<&j{!|KR*>is7h#ZYHhMA;73ey<#|yTzd=rJ z&30@4@F@2Zmi4RZ%%)#oOq6-aZ|s+9Bi)IBRc(>|Cl%(X>4Mh7A&!QI$=zZO>Wtw@ zU(~B2{$JlXKV=5@5P>m?y0_H?9cy;XI)s%C;ge_<>L;YSEZ@P#yR{C=jYoax;CE<$ zt|qoPWmGFncl~q`5mc)Y?7JSKQm0UOKgkuy2(mKAx47yIfQNEYzn4GQ_ib3$srSxI=OiJWyklPj-iL zF!+!~TRXi!5F^~oc4WPE+EVsRsTvb90{k&;G`W|`s}wM=J5hun#}+SU9QRXpNo)TGv#K$ZyOufY(*R{;oFPT@YeeQeX0;u}!!n>JTgo zQA7=fHV~2)bCV1}{eeG>6DHvxJFuhD3+(wu{EyZ#W#`8Z&w(bdD){ z&nM(H@tTF+8SU~W*)QU}`%vs@z`Apt#*{5|6+A|4BJpM0{AYejET-$cmUyJ+2@A1L z(47ziSYzn5mXHMjKe`K%aFdSj69OW_C4QmGQUwvm>#&sT4KsZI<6lIa81JR0u21a{ z{eRRB`5*LGE{1>6ZvKy^0j}60s6K#Zur?bCcZC;hoP7Q@LQ)GALrGmo5vT=f0gD0` zf1A(sefF9IOui?aw{yGez#^NUvju-v9J05tAcMzd{WANv(zsl+-LpNfCiHxNKalxh z;xP?KPlhK)Q&%pODM#mfG}@Z0Og1P>Ri_!|X_uQT6sgoI#c zOJ~+vJe(L|ze#$sVAHUCUZ+`HIHM7w9>ki0%ckq?wKtPyhoS}7!*A5W%{186yO{%- z-|?7iXt<(=!UH@bvHrEd@5)3SQ%dmTWZMdPih=zp^xOQZ7h}=}DVEU!K%cSII=r_v zZM5Vl8%C zD+WSLkx41O#io45S0QYEtIZ@y-Q;^fZ-epSp%ID$;s80`*w ze~wJ5vFcJLo_jR3Cm3r8AfP zKjc6hWB3J8WgFE3t@K8{a@4zG+r>}gfD_p6#ggii8BdAR93C(hDAW^8KV^T&*|J=0uL4n~4Q z%4B|XJhKkIr$dF2qf-ZYI7-~2(p|-46%lOLUZQM`*5#UW*zS$Sq3vo^<)Q*MCth1F z9;n{a%9W~tL!S%$jewS|x6NOajj9C|Ha`K$p-4?A3p=sMKvVGFxMmv@bhrj--cJFL zQjZ|lItK_?lRDRb>4vZ|x63B~?y%A361^rd^~u8uq$GUS^xHeWwq^5)!?dqnwu^WR zzm{5Y>#+IOC9Kzq5)64X$a$F9g=>KEeU86_@HR#78+z-fdqAAuK1Xu)UF@6v%p)xU zsXcgkp|ecx)QoPIhZZ^atoc=`bMEK<{_Lsir)1eJTwP|=uC|Dl$xJ^Kyaot z3ZX2$|An<svmt5_+aNTBj$fdVGLgF>sGdej!6 z$cf5FEC~aU7_jqI0!tP7T;kEe$#@ow`@;E5eEWUWYoTdql0L1D$JetGNhK+I3oVQB zkFz~5FFZYYy?tJRdWgee_Z5S_yAz=viZ-?xv^TQIEd;^3pS&pADZiD~q^JV_#s`Vq zbvH<=c3R(eT+L32(rlUm6EY>Omuf-zHC8V|yV(dRX=a24$;yTsz$|_gH_J`wUC1Xz zrRguqVLaq2F3qG9y5VL<{H+4b1qb)mtKU$8Rp+UkDL)4*97(rI? zg`_&}@*u`EF{^@V(;l$91Fv{{iY&AsnS#t7SRXz~*knIgWQ}dxIl$9g1{6cV^$Dk~ z>pv~O&~~Zdt#s(tV~DiusY%&x!oBZcd~I?fxZ-r-N+A^S^uU;dU4gxEVHq87EA*@E z80#VaV01uA!91r`X7 zQ3Yn$SLiC#LD5R;0218?=df3_%Otm*GIuM6%a-x@kSM>Qu#QB+8J)r^(D@r20g;XG zJPceC8$7vvqQ>8aIY7V>%5nU<1Up0bzrfF3eofEHZ+=P3U~dRETE~3OF@<%HQuZVY z!XLar|6pV&S7E}!@(fg34<+|11o2JD4kLvwiJN;}aJuU#=nhbL0U26(nq3y}ehX{$ zXCV3d$b5ub8MW^v73x7HP5iL!3R}tw5RdS;wUBP0#-Axerl;o(iqUH62(!{keMSdx z62_7RdXX2S$T&wxMA_=A)+6Y{vq5c!WU7{|lpxLjAi6?yPwYVRj(S#85A7_`a7KZd zqQdofX6ctvD>x~sDIlL=m!KjIySj=p!k54-JZI~VF;wV&?fMId$t5_K6Z-^VWd9L# zWB>QV)!p7i$kF64vhLraHcM4U2}cFfM;4M=BN@0zUdl>9(n_3q9eu5A#_*|bmcRBJ zwCW)-hYY;6?A#{Y{FB^yr>=v78MCyBXs6Q<{^3)$3^gL6|ETe!7ti$TeFxd|*_ECz zh&>Ko|5p+(E}a{Zw#-RYYYlRa{BMcV-WtliqQ$9b4~|8|#X3k8*!r+cWc@VH-1QvO zNz_SM`c~v|4_+x|ZxokMATqEzudQONPv~YX8Jyxdv{GbNe0#b+>FOwyT(2DyU+rco zjtjBVRotr>4Koey)T`qmiiPGy4kIwSfC348pmY5p0~N%Wq%&Diq<(RY`3>6tj)VoD zVhCcH%o~wQqzBOnA>>0h&&?pLF2JgIZ!|u+E{$dC8*iyA+%#%glpi|ZDy~F;s9Ouk zg>I4-CwUJ+mA`A)*+l~spInCrOSM=NMpB{E?o~nxwn)1Fx{bf%P3G*}8LgDR!RkLc z)#1!*6e=P~AS$Uh(GRsG>I^#jB^eva0>gG~i&I53HbdGeqJ~~b*BlhAZo@OBkDRY7 z0>frCP6Qj+hF}v?o|)y08@DgpH<{FUTu;ZCZ+ng2KiKIc)kURZD|sf?0)Cl_IfzC{ zPL~uk#<&q#`~c4UN7O#J6Op|UJG6##!F2Ekh#M-ZeV_oW$n4ko z!}GkQ(q$nzk+Y4KVhGttJW5aSpXlNH9O2KO3*a8lo^1m@J|V%_X*=E5|M1WvnY#6 zQvNEBMZc`G{Ui^R8UnbeHsCZ%yV#!!r8`v+Ima7nMs(uA!-(^KJO+FY>{S&hcEQoX zWG0IYS0_U`N}*`K60d~xa~(LRemKQic$3ZlNIP0!ZP=T!j(!ljV>RM(<3j%p_Rcp; z9R$oXofnp^z{wX0siPBa+Sxdd`OOrRXmZTl7jgM#<}_6A2@jTMl)+E&yO|vxo*Hv~ zCa;+C_Lk1Jh}p%jk%MJ!zu!VsxPK7V2BvMhB59J?9qF>LGlq|2_Vc`$i&dnDdC0@! z?<;J+DKS=0KMuCn;JjkJSKm+wq2*lUd$Ztf_5Q-E#|parlI476zT}VnOUBLn375*h zh}X-X?v!~RIIp>hSvHw@D|*mZ*vXCSgDgFxi2@I=+k$J zg>>&ghEJ5&IjG8y-F!8`&M33>l&qYux3yooT6Kk3^Mt1b7`G&W8XARv6mgLUK`uT4 zd)Nw_mw_lFq&c@=@bF7|1?{&(-BtSA}iK6=F9?Wbi;G*3{B zDmdDK#?Sy5hh3<-?>{Ik2yH0cSTOKP|+#huxFt<5J4WoNwCzSO1N6hvPS<#NDapor~Q>oCRrz#ayng#RhH9aQcT=t zNYF=qPb_l^sz2*yUDGqnO7P8xuz|Uiofxbny5=e3s~o@iE{;vkwHkyDAJ@q<-b;8# z$QFRz>o2hsj?R_x+Rs}A{)y%O_cuxUfBGo?>n4dfxENR~e^w$VIa_P@f4OIsDwB#R z0*D{rf~37)kl@1ie3gMmkQ4DWpoMM`Aa)oG|;2MQGI+u8&D6u4c^!Kh{U3VG{DGX`F7u z(Vk4U=&6MT^-wrX-*QuIz)@tX^Tbs(Z!CVGqvmE6efS!1P6u5D8R^J`cqm#l$9y2L zi3HIHSHZueZBt{R6}Vxt$fDYasQV(f=Dbu0tI3O-0Q=VZjn2YJI?n%%90q{DZ}z<$ za{Iwp#|{lKEe~^9F6opt%3b!1bFvDpChgSTouTG@Su2_93{EU#!Q!bAV5UTX-ajOZ z>wl;slFR=Js@5hIn%DiKe=V_03_SW`zHI+TBdhj$>GMG=NkFG2i9cpBM|v_R z4%89*QIfW?I;1-%Y{v1tGp-!g(sW>iQJ4X*b{=MOI|VdElF6~25Psc~hLSf;e2Ev= zp|?RfEi$DU_RGRmdt-&^5lMf2ESO9Rw>vpa$k7Mr;IH+;xt|Yf;Qf{>44g+S?T|EA z?D=IvTmrlM7E1EmPI;F7^zXhrOERd{Vip@GFYGt`79D(PXP3=df6 z1rII!)8y`7fROK`&2js`#1muD8Wwhbpt*~Q7n7Fo<{f|C6Fc#aIYA=ao_XAbUDc9d zozL>=jdC^wTrwg%3HT z-IZ>T<574sigqvaau+``j|Oj?{Dst@Vt8zYeP)cHf21b-KZ}LG%TZOTNGbgl3x=#X zef<#R;d?}ez$1c*A=HB8km+S#LJHa4GOUaHcIv{~ampO)$MkmTuFG&6?)2Rsa-PVj zJ;`2Hp2F4FHgnyx}uS|XJY4Km*|HO zbz-CMFtETCgTHnS!)0)(6r8lrm8L)6p$i!osUpF4f}Ms&4cTh6kmxo^IF`!Sw{#Bb zV7)a5Bl&81!1A=J!P%yyyX@LzxP89w zmJ~TXkzX9{#Z#^OQ;!c^*UmM8GESA+FuZL$wU47K*sP17zxS83Xh%RZV6cAgyKdD& z^XX}DwZE~3Vi<^^tYE>q6MyvgAv|HXtjsi8Wr?9)4(`?|C(bou6!@Asdrj^?oVrAx z(1V+8o{De++;2TXW2nxRGc|vmXmHP6!#s170i{L*2(DKa?MLoE+LrYh36M+cP0Dkk zJ9ezzRjg$yO}Kcg-uR*O5)HgYeFaH%B7$U%t@HJLxZlQN@(u=26#F%fy46w6F~c@S zh&FkfJUN+7)e&~w0AU}f${jHCtBIzJvO$Q}i`xb=+>BG%0gLpbI<|zj$k$onJ2Ezp zZtt>ykQgqk&VUJ`0NL!y$qM2t=!1X;v3Ybn*fsVhGZ`wr5CSc7Q3|x$`iDwgG~!ph z*GPDP1BpW(9lkKyv~Zy5f)zW#qp$KOscl`1x$nt_NuO>`Ug?2@JG?kc_EHVTqdp)29a z=&6ENbUy+A*QR zFh38D@eqCHGOSC9M){9>o}&DDjNWKfx8ZBjcs@nh#Fi?|kehs!<;Z^Jh0>?q4h@yN zc*SM66NTp%w6N{w zX10UDWR-@f@kUzu5zbO0)zr;aoCB&OEsRehIsMUOM=%F%N@n621#u_0H^~5pT{~E+ zFB@#ITV=M`3yHJhcSBVa%FzpDB2ijhtrr(K^owWGuE%j}nR&0wUjRrg%fs%6U*-s^ zKu|iCoeey9``JlHEaOe<3!jOydhgLLsoc6|A`QY1{5nnJ-fxx>|jUtS>ycpDc zJuPxXlh1$)|9^DE_Fg1J$|2@EGz|BMh zX%5?TPRe92D0Tc(W+mIFAz3owh$ebHQ?Y7weOr+7lwq{yhNF6|0;Nrn$k4kRfTq&YV$-C>4x`)PxG5qCClwv0W#;uAAT0$G zsdDe4*5tN!8$OJgV#b#UI3+o3^8@r=;p19r{+I zJFoS}@(iOu;P(F8ti502Q^~+NL9lud6@emm!vjiy?)3fH-jO}z;t2?rRKI~a&rdd} zIY5QUmQm$Nv6Z7Eu_H#~mS0#p1fIgj;d1#D4j$tCUN3Tr4{Zq`fx5N93zA=A*3e)& z6=jc~yT~pRGD{pg_{~6V&@`D^O5ritCLo8dU24#!;`f2nMRF>09)N(sz`rJd9i=qQ z_nWpb#{O&1yT7P&g5nucn@t^l-(m7Qv$o+9equq+jLVm_^>*161SK4EO#{#ZK{?Nq zHGvz__EU(&lYtdpZm!?zRXda+(N=v&oRgb97wECL_l)^jh4-aP1N@ zNM}4#Q9HwVduyb9zjP{xISe?=?+b+vHJft>GBcL${r$lpQ2=c`5Rs?Rj!kRkiokv2`|`?gMo>Z1_q~yGy2c8f=1%ERq{(L$5j%o z%H3c*4I%(jiWcnF^NqP(>JWfDAH3{ldS1G_XFJ*2y}nLA>U|+)zyJi@Kq^a*gpRx6 z3Xo;nGYs;~YjYp&X+X|Go~9uhGG;S@-fNRK*YQVa8*Mv&$4o>UW+;bgQYcSj0XQ!) z=rqpQPYQM_TmDdW-)0>z-p8&|aR@3l)~=GBYK_5`T!{+DWv5I7e{3Mh%#iT<(OXc(GG4pEEOdqDtlAXs zF6rt@gDs^_M%`bj<~|s7{Y1I$rLAQ%53kiYSnqUC7Vlg~P-*TtVIEksq;*2WabLHD zXPPcg57?;;b{bkdJ!&E;ekAw+_entX*x@CH2+%!@Jkax{&sT)`6% ztjCSgb=ao3w4}Gt4k~iYqfRJ3VJUNgJxp_O4nQhi%?*stp(u1=Wd|ytG>bUqma8jTdr<02qxnS-mj2&1y4W%#31#Ko~nY4 z8aVJZ`S|8}$S~Ewn)6K-8DOwR2g; zzzm6v)u>>*qK{n3a<4Dj11UAsA|}@pXZAXWJ-c^Y+EMW(M~9v z>W29pOBD|;>`VHA&?0YenhY)0rCSm}yZb0eX9vo)<4GG=+Yc6Q-F?Oy5QUUVxROi9 zEPY{>pQ2W~AILxz2hgqgX|+v}a0RJEXP%tc=#cus3CZ@DT{7`Lm4pv7R0W zMi2b#wZ6`$d|7Ao`C*+K)J2@!wqQ-SFKIL)M0c86iScf0H$kYqLV%Cb1sH%oY$+q| zB+Mv`LFL4Iyv~C-qw%89_U<^LA$+rU>Sj|0Yk#XDIf%l3u{AV__;zevS4cJH&f^9urw{(&w!u+==_E~`I)m5v0L6oK{rLw$;0z`vt)-V+ZH5FkYAdVF zF^vJf)&06Nk@}iC6ZB6a{J~_3=%_YLY~Xqxw6F*}%@+W}c-8d{xuSvRo{khJ?Sfk( zRqv(-phRaecQ*oi)za}@M5kp)YyJ2lk-p;I{HJ?H_~ob^E6aw=9^NHcZD%G=#sn}$I3L`WYwz{foLO#mtf_d%T2c-I&%P$vBt%A|o zwF0Zx)>ok&t4`5Zwgl8OYuBVG29E*2N$Xj^`NDVMDABJN65yD!NDu=K=*K4)TyoCv zfuUUsW;K)3C+ly1A3Ct-hSx-f5R8>H5#3}a0GPX&EqVR;$mv{s46R%v%#wRh3vI&7 zUsUwLRH^bU;lwu5C~J9;w(QaU2d8nv1?-Y%_N@L!4R~Z9%tsES$xnYlc5&o~Esvjp z*8GpX;=ga!_@9+Z!q&;zz}Cn_$lS!p>Tl6jq^hO%IWO9T02b=Er3;YTfNB1@P*=s6&kC9N3pHQc^0MOZ8{P+9u*>p=5^JY_qrFc@^e4^w}FB8ygwQO#ahmORFjvHA^;D+e8&4&6jl14`wt zrA~yK>ijE6q(K$OTl(-tmPnOx-ocZW5L0RXvEzEip@>0lQeH{4mvhFIBcRrp$G40) ztHC7(quwDuOX2jnT55x$ioGaOS?HFs9EudnHtR$+-N=s$WDk7ne85E* z6a1c}9=D27wa-Bqz{O-+T)3I$YaM|tmAE_C+sZPXM9EY>NT3a37fc^OrCi9aMtK!% zla)=cW}q>ymTK057vkP>-4|E$-IZ_yC}L~^1}tw5mMG4+0Bvlk8#9}^)U&g|X4{gV zwxlWe;vK?KnrPePII9u5E|4K}}RL zb({MUV{;jw>$sGEUH5zkpq8Y&lFhCN+s{~BO*&}CiC0n+b%WY-L~~7clT8iXk47KD z?QbOAV6Ew~w^fsC_;nI6BXSi(94$A`LoE1&h(G(jp01~3n)>1Uks)r#5bC5(Nah&w zZrHM=yi{6v&#K4zYltuF2wG4R-6z6&W(-EeHck;IR4UuKP_0RM)WNNcQ}^I7Q9U1w z@Z8pz;To$n85+a&2OY!RQt6Uj;e@pzRnWA<_5dgEVgVggVx@~?Hw=~gA&cB#MUjMBZYDR!)*MgK)}j`dv2V@ZL4>!9od^0iXGBVd$A`gc=IvP|83Z#{T@bC@Hn5a#1#x=NoW zBrH>ECDwZG{EL^~Iq*m5N09$b+!LQM?s~ zQL;=lpdMB@38=9{TC*#U<}ln*?_o_#C8z@!3@_ftawCrCt_?Hg0oBHREajGZ|k=9NM_dFJglbX@n5KI`1-&(%LNaGrS0xuBLY$ znyOA^4{Iib+)WG<=s*&MkWG*+(|`TcvVf@caI6w)g*~I;{H_Oq{Ir-q>itX-QDBqC zNZ&VO^$L@%Qy2z^1X*Xghr4w#s4;*ExCg4orM*>Ma}dtvlAzOD+M2L76)7D;HpAT5 zY%b*flZ6um0u;3+)kNxv<&;}z=bQ=@E>?vbAkd2vQX~bB$YWQmnTVin z`9w)&e#-B!O&yXRY)-U|lr4X&Ha~cUjZrN{M6^A(`j4E^Sh zfZ4Z^bJL>tAij8`?xd)vl|{-sK$8_zNb1cbsFG&LUV)7~qTi^Y4XZ<3t7PD|p`CKJ zQNT#6=_H7@u@Qc;K6X#4rxQtM7Y9MNn>!kpV02Mx@=fNQm`*wU+%ul*wu4;SE8wj2 z39}y7OcQdkhr2%yj%Vi1;xwU)%ltwZal;v^4+fiTWL$j3&on&z&PY-3P^? zc1y_zY79gjCfN?=M<*2-hf~mx);v{m@N~&VbrFK)(kL(+1;{0aazBf)Aw_L7EGU98 z)KQrusas9xsBG8McZ`X8@o={YN`&s%Vx-S-V!PVRrFB9~$C%q>&c5D74>aF==f2?r z_~a=-u%5VMX5Dr0zltFZVRjYFhOOBOhhg=mm=-068f2C_9YKCh*ztVBZ(;fN?%4_fO{fMee3FN_D>Vo04dp& z#sKYXOp}0?-mi4qBXbUJLiQ~vcZvwmkej)Zp#QcXW_FURhBjrygSH0!gY8tzmkw*R zAgd(2l#35l9SA&hq_Xb{pK<`CrA6~aj7j`(OZKNCp!Yd+?CCm zj9T7eohw=)G*)|ulXJ1prf);peONoK+K;yPp*v4H<;jpw?u6drJo6;!<*)&`_rchb z-Pm8>9>?3?q?n(z?x&l~yn}}q8>6{cll*M9=(|j@Ic!k=**np4P0<8p_Pb7yT{9r% zOAs1tEjEgSR=>x&gmB#oo8h5@EWMydsyFbTvh-S29((pVEsy!fY5Bj;<^JC{*wMnq z!r9`x$^RXN!TNt%2JQdrdh-AKm!O^7XHgV3`6DLfY(o4WfB!{o>TgfKQFZ+D5dKO2 z)CUA9@Vk@qUL&y(j|7E;gXioJVdFs$2I!Dk2<;okr(=;j?DiEM_BHb5s%jLeminna z1NkH#UPurJFVO zQLAqW7RRE2yW*zRN9NPq&LzS0r9QE=>$(wFZiLc{M7I-aLzC%byR(ncXk@bS5W_|0 zSwz#>_aCTEVaiR1MV9wY+jnt-;qYG?vNwc9OxcJqQ5;^9>2Dd0!vWg}u-SUvps$sZQ&;kG_4f zkFDM9Ael7F!gj2p#8PzFA=8}yivd8VL!B7|OSh`oA$olvlT9?3OKU_{N~{g+6@SZG zdpoR3^Xolj;z5WTDG@GZ5j)!ayba&={Yzcn=t|v5UTcJif%L3VVZ8K7Xf9RIw|rP0 ztyfhcHX$R~7KvX&O)VTlx6b#PggT{?R+-K=b7IUq^w{>`H{oENV*%&z>NP-~_%Dm3 z5R~WMH!aalMR)E16qUqC08GO!7+T^liSfLy_)y~Cg`ehp1-2@{LIm0aMd5WmhvN}n z>7rn|$|l;1KV9j|x!5KU4_Y%XcA2xXc>dre=tcX%W3L@@;N7P6C3as&##-P*uMb5Zl2=y!LYEYOJ? zdFMJIqWr(1$@@{m?`01czyIZeCCxK)tnmp*>-}R3to;8x_WvH^>d(F?%SgYgXe`tW zfr#LTk3ywzDM3X6{NlAjH&EajjLCUP33yf(Hgs{WoA+b-lIcOkGIPZ?YsD5QbFW>B zMgeen5+|F*kKWsAbJHci1^KevskD9x@YdDd_jj<}eyUcbu`$`H(!E`!9e+6=@O_iN zrVn&waAOO6q<16sd))J8yiC0L_@a439*6*XjmeAI^XYtyzkWTynAx8&@ovC(aSuAp zyEkm>`k=t~&{iMwTsxiRy%Dp%xk~nCZf}-zSFoDpEjd(T;zjC*bEEOON_TS$+tsrZ z0c72mV(jIPmEEV7Y=C+UvJ$`mX2VGPBvDd=W)4jYZeHR5CT1*6-ctCDa=$LX47Fjr zC4Z+J`V&G|xy}q|i9FW$RTfZ9aT0su0=6x0uRO$t<|Q@MOp?f^Spr*6w`*S7zQ!_- zIbq5?Tq6x-nPKtsyOJml_FM?@NYss6LlFUK9+Blw*+R2{S{(p&Xqu;KefI1tvsiV)j)nC1M)7M>_(86A;-?IF7H3vw zmqzEgR-4+YKDW*{A5-WOz!Sx-glfN2_G-7IMbX;F5ouzSdc>-rq)@sm4 z%}wz~R~sa~&Y+)3lj^MN+Fsm*?$o6O`)0Y&w>P^CXc7*kWP+M#dmpk%kz;EZEmJ+H zxn_ja3hs?V2_u~LJCWz|RxelDp3*@JR3*o8m#qWQMl5z227{k|!p+-1NU<}8(At0z z#{s+CLO~&c)w5;wAM6)K&)dzYRHVD)2chAnPKw%9+n$+*J8yB=(U1=nzxw6#9fz=FyJmoHhfEHv)m_ZLTY{t<)`(cl`cp0!@Qf-}0h`3-ziH&?x}+-`O& zTZN<*m?M3&gbUeL>&K|Fp5i;UO6pyqF7gBI3_^w6C44x|`|@>IkYBRosgTfOV`C%o z)KtgpS@cMnEZv?v6^BZOniW}jk}h!Lk=rKe^oEL7ZVyc)cin+c+G9fHLJ4ClL>}|N z;E$4?LUblB`R)};r&>7Tii)f`EjZc{oT}c|Ks1Hf;N>4DqKbo7Sk8obd+@gUSIRfu zZ~TJR4rt1GyCIa$Z{kBSDsQNK2{%q?-92*+SR^Iih$+peHu+qP%yq@o$ywrwXB+h)Z!Dy-yYt$TL6=YHq3b=ukO+xzbv zZMN}a^#1ne?eBxc)Z|zh@}Wg=dygJ7YwD1QL-@R6;lr||c1zEewCJtj^D|-F;B#)z zO*Y$tybU?#wX5jis+H0Jms&%1y^C!qs!A+EQ1z?JwKF;I zv2uf%UKe4Kn>JzN12Io1&)Y*VLEXa^+-7lX>H3;1K9pa7x+RbClzf4;%3wS8TN{=K zx9?z`&fLUPx@XJsRMFSq(dcL0oMUgNPfGGowXWYp+#hi@2>>>|_ z-0jXsqQpJE$Kp~kE9sMqot6)*Od4yFKdJ>mZV#VbdrG*28fIAT>l?srIXqPh6OhaF z;X=O*tWoSP&m`>qib4^B2TQspf2t8Se2=$$qYfw^4{n^v3;OlB3;PqOf@O?d+}DB7 zV14YL!xs|19hhmZg^1Wb^sNXgc=acS{C&Qgr0_0UOSjw@gKug-1-a!6NH6)6stCdGfkSe@oaaQurY?u zrj=B^d$Gf{j)~XxeBI$U1_b((Pw9N!$u}+@otZbdx9;G3Ngm$(d$_kxL$kCiiJbws z38rd(n0T){Mv2E1|w81`cPQ`=uIi?=;t z!DskCJ&@x!d`#XnS)QsIJ-;b#=>fuyt|?YXsDKuXoN%7UFsnsL>b2z9TLiv1+2ig- zLALBE$hQU{+UCH)0;AztT6P!Nq{3CpIz7quEMn;FP1*LOWa`4ruC_Z8HkOnWdC#`c zyLjqGcIX^(V>8$k3`*~h%s%o#=$@zzPHhbu;neV6P;c0b&?3D_T3P}Apr#L~k?xXJScW;R*xwdN(V{Fp z2+*nlvnTBL&F|JypapvnOk-TxX5oan^%SzBNeG-|aEl{5{{s-0jUm($-`lhnBDB1@-7z0^KGRCaZ zw^}T136Nza|1~1pCo4<;VnJ$Ow*)%F8#C0aF3W@2n;5`-m%z;rR-7utX#1(Bl;dwZ z?!ULdh?`k=L^3Bf|MEz8@;%DzI7Sh=we;HgJbr@>$n z)X>Mu;V?CY*|4E^5WR3m!@6%Pkz)9403jVsCm}C@qSh|FjTTz9zr&h%pV9&Ld!-v6TN9y5DfKyjDQZGb0P7t|8K+5mhZoJ@LZUt<{d1Ws!iWsA(jPP0ER#bKSrc6At=U4}b!4a)}a zZ{x|CGX55u>f5EwiQ*BZCvgOHXV6D1F~k&a;7tM9+E0}JBoULKyf%IHv`}X^qJ;y;NsvuSySEQQ+hU%ya|H z(5|9x8l7)9W2=6qH`}8KQ3+2#*8nCr{_MBt3Q)E+mX96?!2a|>_t=7IV}d|RQI{Jk zuzIbUd?&e-PP*s9&*iqPMjY1%f+<|;lI(oufl6V!2AtCV*x)Fd*!Rb+B)-;@GVt>K z`2`|=VbQ6Uq0dx)ZEn3@WwqIZA{X;X4anfqEbDJoFm$D#Pc{4p)XVur<}|ayJ=ea? znj*O_pPFT^S#j`a`Mixu_s237mP;Rm0P_v80L&h7YjUC3ua=(KlD2->KGdn~=or|- zDKMXf`^-hzjLS9Rd|rp4qc05>`GiQ(f1ofTK7JHmSu6!H;K=8t4I#&4iSiCzgG}nd zxfWzlJtZ!U9gAOdmETduL(O{8zoSjU=@;-Sl233|k<(bLmeFSs%UP5B=1+&9WpcH` z?Fik(sLjde55kunLS=)VH^JPoX0q^3sg&C`)e%p;B^XV2md#S+3N0({2oE-s{OL^59kL^>XmcenN#mRsVjh+6(#1 zLd{~GGrnMWMzKvEY`&~wNNjz+xkF-h7~O=&i_@sv{kI{}YUCZ;@3$#&)+lLW}`&jZ=W}H^8e@y?(uIZW~z2Z z|NpBUQFnlirLm>6jmKYg&g4IyE15b0>_0=#jBNfj%wtep`>&+i_voMrvgpuIjVi73 zG6*yj!9k2duuwtVFjEkYCQQoFAAzG}6sSR46~B$_dqj;Zs@uteNLobX9Vu^ zd``4Fb-Tz6{Pz; zZ^WYT8!~>;51=^8tk4o)-O~sWHh#n)smVTmXw1W)#bR?`0S6|Q?!%AJDio}kfua2N zpZ8_#QmJlhBgt(>ti8oeyW1y}H6Xag$+ppnPSg#lOeV_I@jBkZ+m1{erZTvBm4@;_ z=Mo8l_VlGtJ6*aQj`}^ZS)*hI)fn4-nQX66ii6hmdioOa?FkY^xEfz$_9#@sqexNJ zhm*z;z?kSR2ZlF`wryrZijx^docc9GlHE+<-A^f6_Z$?#)k0N}9svnrd!%G_1|5vYHTjASu}c zgUu7DUhKE7b7QH$13E2HpLgFHe-4uC<)C^Cvz85ieD{n+^=ryLs{5{Ia4LDDc`nS4 zqjUOr^692;s+FRyV6}$cW!hzX&uB#m7I6J&x7QCtw7NT{rViA>b~VkQUDsXhMRDSpnVR=T zU3A+ve0706_c|_{)Z7uhAM@aGIT5{%mdZONsmuy^mr)7^7Z+iE5 z7j{*2n@;~V>lHGGtdf99lx6A8qV@oYuokJe#FhYC6#JAX%c1~$l&eJd6s=xX6i%r( z8+!T`ddS}+{(|&X?s5p{RjT&$NX#qWZ`2iPC@ov6JmZsXmJ>``l;z`l#P~<`e#hq4 zb-l2MR@}+fri>xJ1!=uSioFR>{>DwZM}&D}%pCf~C63)DDB7bP%^WH1f%0mKQb8S6 zGPBVE8t4uwqDKh4A<)bJ4L9c=P%FiYb^QnSufYNRS^02RrVt8w5&fNg}H;8NO%-lht;O z+uA=0SxSNs6R<0W-UIdyCOR!uCzOPiY!tq>mX$5;=C?UN&;Pof^X(088$=+I7$}3L zXkv^t926#rYHxkphs3a}1P8&8k;>vQIKU>d;b5vtV`txj(>DMY*hZ5GFiksLLRXC7 zu;&m>*s;=so~CKyQ@o{3N>)Xltf$4zc1}D%ZYdI_!$+Xt4RC~u)BMD?!?Ds2v}9fV z26Q~=y-e{bQXAK2NlG+aQgT{G$t!R=L$@7)f zC^M<8e{W%_4KGDwOQ^pZ%iC5%dfXuUsa+xV<*n+fu!feXH_>wJDcoJm+b{4#Os=UZ}o5 zIbsj&a5vO=Vc>!5uA)qMQpQ9t*5EPo5iu- zxvFXI2-QpWs92Yk++Gith;}l5fB+JE4m(@sc~uBaL!Tl` zomLtAARtQi081Vf82HJ#fcx|A9$yT~z=>(a<@+k1-0TYM#o|IY6j);N*sHWt1UbZ^Cgy}i50=uwTw7j5p7-rx}%hPN%i8CmP;_O7&QDAPJ z_T$f#xa|~@*s)ifAb*G(6JFRZ`Dqtl&QI-B(Nph4gJ8qBap3Xrj@9=MxyU`XHg;^T z1KG?H4q>UepMUe@&CQH8aXyi&7u-L!;a2|@$o2mWRjU-o(+&9&E{sytN<9>sP0G$oeQS<6 zNjP58Y3ah@I^43EQbFm2Ai8-;JHLP^#Kk4dY#g8fq9!hHi5WcSwT4{gXak=E8)X&q z%{tE$d6%`#7=np}3QIRDn--g!n_j!GUboiXAG^iPD4@x9VD+B` z4!7>6+8#4sa}KgImbZL&M8D7u2>Uk`XIGx$$eikySvc2@9bZJ8bhW1~!~;!f#0J7o zRkcVA?^9KM914~taQ=8Mu7NhVn5D2Ar1D33%3RIHx5El=_il?-=~skXn#rpsq@7kl z%eADRuANF=VoO=YNiSOz&!&V^t2O=T|I8k&xm1VoJZ! z7m78yVlZrwL%{#jei_v#IgP2^$T?WtV0OR}WY)69PRGd`WN_~^$JaR>fV4g zF87d$w1Cb;M~L0mpN|`ri`}cBG&^)4N}x$PeyySqI_f0Gw8BL>1{WDK8imWj%33#- za@&yuiR&a*++vhu9EXmz43SKiOUz&u4WqsG2T#_bu|dXlSMLNH7v(s6HKGLpHN=PX+OR!$a7x9`Wi17AH4Z;(=xj=Ta&Vrw6*xW756x7b5nJ( zf>Ui(v@m#-?b&Id4*TA1>(X+`u&s0oWQnW0RSx&3##>ZRcu?kICz%`FXJa|XQLbG~ z-mW&kN{i9$!5r;afklpiJZ37H&mbH9=y{yyEZ{6%7$omO9ONaymp*w8736G;Hu?t$ zpOMW({sfIDDThLhT?RLwu=H8nwt0y^{r! zF_c+Lp};HF^Ws`4lgdj#hMpzBX4Lfk#>T&#`qXs?&%dv5(MW8!J$XCYby8ndV3mnm z0^${E0Ecl(v;vVbUrOvo%O5X7XqAaWO^i09_WEfiIu^6&_}UO#E_NL?M9S+o17Wgp zaHj5dzm%6NF)3YJuR-+`_Ov;OsBxrGKY4^^!R%($unViOhMLT33rM#etw1~v$a0GO zW#uLd;=W>xL^nneqPD#zv+f={RfU_lyKMp@f9pV?oeffHW_%Tc4chh4Lw9R-u0NQU zZ*k3@r(0x`6n%MhuD#K5mcO*&OD$AHQOZkw`o@dUYU(h*gh3#pX|sfsfvXsXP3>;y zE#sqs;22$*8Exo?b>uPFCTUZHYfogykf#N;?lC? zmFF#y7AF$9iBj^(IA$be*0V|#9Sc#A8lk5824dJCdt1biicbR5<7Uy_7kGaJ_`-(^&-XyYqs()7-V*dSf-mm%SZJj*$xBiL?(q^@b=^*X zY@TfV`Hqsru%wP`nITyYcZV* z5&s@ZRBz~Fsav$kklnXgf246F^ecC&%_MAXk{JVuubrp zn`xciRt?)T2QQ~Q`KaqynSJJF?0n)YXb_jr&bjO}-?nJ$7?*IiVh(&xkyo=(*zTTv z;jnTr`lW69*p(&LXE4tz^vL|4VL6xQG2^;fK%Tyy4 zSlVG@!KnV?amU(S=C*rkB?}CM!8;-2Ub^pn%ZNheq&j)@UemZohiLP`)_XX@ey1a{ zcuU3Xtu{PA(F`$3Dzrh z`$S#TnXE(evjbhwu^BE!p(<0=F}cJHr~Md=J3(-jmQ01g0q)4jva#!SH!ca2RDMEz z*ph+@`Ma&ccLBG=;jV8?V8)Dva>#?_oz1 z@I}P%#L@wXRtZ)jbOV0VPc+)PHQRpmb9+IXzJhu}wY&w72erI4CaaN4V2t0$q|m2m zBbW6J*k59MrjB!J)YAEN;PchPW@X5N{??)LGw%_B2GIO;`q#ycIjhUR(kl)*fYNTv@ zZ$;n1uZeTA5{-Sd2)@CN*~5d5Kia8fB7M4aor8TP?k#JbX~E#{RWjO50M|Myr3qV( zdHv(tU%hy0v`1(WZQ&l~d0yXE+bW6j00d`ZRGHIO$S|0-VnKcNEJ1yCOMwclu{q5S zv8#k@!Sim>pO(ik`79%6M&va?PS|~lnNth=5ki{slr=-zbeC;1s@pPZsvd3AM8~Y$ zQ#7$Y9th!T^ad=gOd%bUre5lOS9cC{7>;!0e-PX=!&7OaRSRDI{zAX*3#GpuK518= zc>mPn0R9c=SKZRY)b4*KUjD}q|0n9@UkP-$pLxv`dgitb6vVdvu^cCZ4nCG0g4CQL z$s1C#SrjBxp#mvhG8ruNJ**GuFNva>Labwc8)G;K1r%bN3z&a2kJ5fb7gucc-!; z!#dPY?Tgaw9>%s?jCNckJz?MU;5Av#oy8tKa1|4Q{4*Ix-HQZjbmjb$@TgYA5#)etw=BmB&nBB7tt9D_ zVOXTVkFVwsLaa!2$(1@h2uG*mc#Uv4m--VO^2njrA|kQPZalUZH{n9n##YNb-mOC~ zX2-!W$SnnOVAg>%$nJF#A6x1IGASY9_3EY?O@2L+*0|8DU?O&lRZKOQjYuueD%=;J zlcg0Rg?JtNJ=@Ts5}h@ZH~ng-8JE9wh!!F$IkW}+E2h=qh!cOc)}@(`I$Nn4B6fAm z7jZ35rAHlf4}zM<2l%au2*`b+pC^iFxP+{QTEaD+Y!qF2NSE@DI>E0OZscC@^Nb}X`%kNu!Ws2VZ^ z>!0d3!aNSjDG_n|svrMh^bJm3@r%*qOsxj%cho{mMVuKM1dIBExvLTUZC#XSeMCu_ zuwINfqi5plb7J>ohPOxKYdX8#K&;Fc(YYVL#ODU~8+E$H8Fzt+-ttQ8&;TIlfOO5K_7orvbzXtkdyF$2_cU;7chZ z^kIa!PY{^Zy?%b7Qe*9MY;j=;6MtHir?bZ+-p3Ok8#O~KoNs=_M z?7xS4YN>@Jv7Zg|@jqG!{5zWF|ELoG!PowmrujnM(i!)&Y0jqiA~Th+F?UE@B+F|` z5-mis0HkX)9}MJ5^eVx@G&(SCiGFlinA#*-EFnVfptK)Ig?aJ$M)8jH}IOj_(#;=>+z)fEh zrrd2S@M6NrS}YTfeK81*Kp_Z(K)gU=2rsPj2SdW&(?59us0~;5JGv{=3zGsH@g-Xq z{a&{VUkU9dKRt{AUfJ#aA%PyJa)g&-%5JpoH3434tw>jQyMH3T{oK}rAiOX5N_e{~ zz{v3e_$F}P5Be0Evp{g4FWM`Pj(595>^&jBz2{rmOPTto5Yv!RtIOgpKP!abH_5JO zNPs*vST(b!%RJL7YIO2emnv(N4MPDp&=jULtGI047TXq}K!~QGwRdAdhKG6_p5Bgn zx_WfX-?p{oLu^cxF$?KD9~bUOWczSRti<**sj$QW0XK{_C$dga8m7Ab5V=*u?b-07 zggq$|N`<_6pd%inyP1Bc8lcTGCrax!6dyM!UzV8id~IVYmW zY8opJ#5f<(&}st*jb5}n@MJl7Q&DpcDOe|k_8)LLBDG%>(V`eWGWIf__t5+~FGd5> zkPj>yb_C^b&swmkXk=}3?3B-~VQ!bkofF2MJTGBeGs$f`@qSXmY?{+5)^31z?S1Gs zwgTme$vOlTH4ikznGz$`quVn&YD7Fd3;$3Km)&%R$;^V-1kn$WOE}!O(G5Mq{fPN} z-M;H5QM+con$RS){c~ae_i3Qz`iPYBRCgtT6pF?2YwH&Y+@k`bNoOexWT>nnbrrG4 z+SNkx+B0w4vW@Z6&Dg1ZYf>6q?(Qy8a2BIO2#(BGciTdjKhU)1B@YOJ(vR`1Q@Z_A zr7J^|JBu_3d-EXcQ%xc??Kjxy%R8U$l*SR^auDh)t>Hq6y=oB55DuRy9^B|T!=C9c0Hp>~NZci$rOv71n9%4D^oV2u|;W==yOq<$o-#rxM z*qA)PNmr^U^307dvt6KB&TdZpdD_ta+d0IB-})>N&DHY;1B2J_ z%m;fdVZp*~O%VmguCOeI_BQp^+<#RRLAG&{TpQ4FfMUEsmV%YgRVOGb6mK6^2034^ zxp`h>n{10Z4QS6OnQ%*Zu)6EImn0HZM&(~cn4&)tY6-vu|Cip?`Ejg?p0 zn$jS_j&4$H@1LiiMRm>4545(E-C=Bnwt9JQr5MSX(M*-VdVPi><1x;77IC;(rJHVV z)PeV_DYDhY-KP;^0smEeme{f}$8{kN2)6ENa#$k-@j$Krvw?gPF0H@*V5ASukW*~y z4_`A_k=%5hi!Ep?{ezJD2OuJ%pTW+>AtPd47tg@~(s*wD*TS7$z9#JMsh{Pn%Y3WuRV;6`$zuY%%(5A$~a{W;sLdY*AEx zQDV=qr5*5-*@s3%Ep+>&S(ETRO={}sQgJ1`c^XLvl?w7f2UW7cxCg0lw$V8euf`ql#Q;cte%L3d;VFd2j{4p*|Vvz8rT>FmF1CN9a$Uhew!CU+!RG z-h>Y^(Vqq<7^$zNVm%l4czu2Wn^1@WOun0x~G@^$yV_eF%Qzx zBh@pngSf0DRwefQdQ4cNvsXM9Pg64#8n%-zRhjI%&Ok5j=XAicXaF{yh60&_W^Jhi z;45r08njt*P;s1a!);{VGrsNFO8Fm^ z4ze4{?Yl;0j-pXY9ASmz=JZuJ1SKAc=WE}?>$!R3^7$rY3oVLXzK37=kcjFr$`rca z3fQAP{lWmT^5r^*Ak8S=+4^R&9M%5&t{PsKa~FN@AznYy^ePrA6}nqq2hrB!D2 z#AKdgkz`xdD#fLojY3wUaR>B{cZpsGd{*d(3?mX&NcHkh^-h-BvzW-Xf?G!121Fiv zMNEYU|G4Anm$;pM?W2VHCh|n){qc9wmq4m-hvX-sal`tjW=QTo-wdhQTble6-Lgt; zQ~k5m`H+RuL}^Y8SE*ZE!?Bk5QKj%AL`8n9XaOo38mIJ)N0MT6+YI#)RQ^5jrMmn2 z2i{;aBEQca-UsRjbc`DZGKmj#p853UMjPwnR98>i^T98AWq-r37lzcEadHHLO)X&1|$=6iPOTF&znq@ ztB*qS_B&BHY)Pr#ZA>_7mwO~&JCDy9w))kBS~pips9!>nY9|FRAZ}n(`LelM5@~f% zhEm_bz0`{?WJ*T#%`(ZpvOJ_WO2PRNKDH2LcG6qFuiAA{z^zdq#-z>`FYV*TTciH6 z=-=K4WbEQHO#8L;(QDqx_(}Tjsqpj4kNi4a_@r4nc97|avLR=3XNkbY!T+ihEeqIv zvu@#Oo^<2tpJ_L5t0$?Si$fEj9xvyR%Y`j!UBswlX-RZS7(O5Mn4`n`bk(RhmeC9j zzT&szu`X7RS8JqBUYL#P;CTV4^;brt3CuHxc)&;SB-d8%2@qIFoN4ry14F`}+kh_k zSKB_oB2M%^xIbgMpZdH}_tbR^j{whl(jV+LOdH4N`PjwsPGvYOaH#k?pd#ur=<(g8 zNNC?xXjx*GFtDbIVldvE)pm>{(&_Q)qryjnHO3LN(PTkp+*r6fi*{gv9r(raY{ujG zqq55_G7ne z$W{-zx>mcKiy?srKQbNn6jOz`c!^5F`P}l8^<)o4CMK3ciZZa37py+YU=Xg=LB?Q&!@SYUKC#Ua zrJPEBrQ|O7foJN`X*i#Ekn!{-WyDC-M?&Ri3Bw+Y$K(P$vbaYA8F!P}0P42_-qwsK z)J@%v8&L10+($~k{7A20JsgDV$(V5TjR!>P*$QfBjxd8$m<+74yMPf}@lS?K{mIG;Un>$CE+*$#JPe7;af`F0Yh@lUOE ziEXnuu!s4% zf%+uKR5Pbq#vToUpp&cmIE;6SPB&~}imSRPqOKrT2a&UpZHp&(Gz+SU)w(^JCpe-l zc7Ao6>Q0o|;%cQHx6$2NmSYL_v`jascjqx%I(XHdL_Mk~++^Vo$Zb0jzH=+uW}{Bs zUiSU;9eQyNqJ?$g!sBYVBc`$X&YQkCHQt9m=2sYNEL(mq;THeN*n%Hq#P-1wBKU>@ zPgKu;o3QV697EiGDyGx^y^3i^Q!`UX(@(de|D0ml^Z)h>|9|fjH?=c$v^4%-Gy-Ij zPXDi5!0?knt75Na>163_??@(Z_CNk0w9G;}^ zPOr3YYnwZhPb{QoTZUuL!D-068uj|K*FHf1ho4Kah^RT<$EEmnf9cWX(9D;tujeYM zpNH8fcaPK5RVF{D$MbSc59kwAFqIawVhD!JQUSiQV_LKkL<5XK7)gMa(rsD5tKtGN zLyAXP7ttW%>8Gm}6~V4zqRF`9vkXHHtpt^ZVdw;Q@y?cVtdRl%jPeR_DwiR{S&IrV zjEvB)E%06G=Mt&3PC`tOLCnVEZqlg#^}uB>fNX$3m1;PG7TfOW zS~nVw0u7qbd?ww?5Xx^eqdh}DY?Bz=hOo+*TG(Phf{*NV5&-4-r4zrK`fFB^_r_@< zc5$^7s))}h%{eB0MuM$zz-b$}V1-T_2p#fo^)K z>QnU{trLTOc!m~r6RLK1`2gxk z!tZKx{WB^&wAPIiCc&42iSDE}B`h7nZqygY?bDa>#M+&AE>)Z)^s0?Jz;Hx>_#jQU zLLCquT$_eqFD#%0Znui96V6zBkkwl@GwXy9-I7o72A*mIakh#CR98qXSWr$#Zx8_v z-S}9QnI?tco~89;IO7Flvl=iz0zC}RQ@Yb=uxkY`dLdb}*Vi*iU@&< z5`+Jf;A~L42fi}x47Y<(rMTA1gJhU>oO@I)2%qH)V_;E;8p=02LS{=bOmczpo17bZ z-VTvZ{1}Vf`4{4gw&O9DA&_)|AlLe7e}f0j0v=K;jfriQ*$N-k#xy%aeaI_6w~kj zIK$*Y<1zCr#xjKR0fpib_(7eRB9S3+!j4&}?zm)mk%4QcSS0bp9H*}~h-fqd)+evE z_oMrRN5cj&INAI4IKqQ1&S1IqHGgZ9|Q&$_52OAi-6*g0WXDP6~ zB&eZ49F8ICfQ|zwv2o<@5D+ml?mP(?gyIip1kivH&wKB);t0*hSeN5UmpkxEef~hXLtc$BaYDR*+}$~q#7nq0C{i(ay5zlRFGg#ndW1OYd_N$%$tG(^Tt5D;?kd+7 z<6WQUX~RE~!Tvj|t*oJ)rJ1Rd^I!G(f2p?GpHaeS?{e{GbIw#ni4nrKKVfWzvB89D zo3L^P$!+73g=wumUF=K@cu)`LPy`jf-!P6u$e+T}RD;ulqi+Fjw)JlaOJ8Mxf{e8m zCMRQBNA*YN_WILXl!zbgcep>6Z&dNDZ`A0Qa+Tq9T|##*c$|&x@wbGu;9kk_VgXFi zT6icqh|U`JY=>w-qX1 zA01LE`n@8>PyszM3tQ5S(BLU^ntiPu0$~cOx zu~j*WaiNGwd=NC`Dq%34XO`G5k$%vGsFo1Tao8SuPI;E^;IVgh+BHMiWU-)NCEc*3 zn|20ZU|;Pe1|gby2QfpJN7Auja|59F;5y2kLWB4~Kji1MSCnJ(_SpKv!7o!B#8Qn7 zgn?noEOcn(nMsC$R)e4DJthNzyxO#bk5lmZ>}pQD9b6#hMKu|Ga$(crI8Z_Z7}F?)g<3K5e3~)*hhRwjm)%>baeZj zP}D!q@Lkv7_}wi<2*mKbltdJ}&o=*M>8Q=CQ%R<@{?fwQFB>*}7QaOak<1-#45h79 z?W9@)M3F+R1)P1*$wlM@{@A$!7gOoP6GNpWC&$T$v=m)b#&3S1*}`zGoeh%}u59KjjP7UJPR#s)@CA=fFyfoQ))xUsp3AI>xG+`PJ|A>7A zji5v8*kGLfha{=2ox0c@OQ=ZsWkD%z9Y(Z0si%~BX(?rHd zs#1WWSlA%UkJNJz^#+8$?2uWym2MA3AZpJ^2RTz6i(|?*NL*FBD17XKlE=sdw6_YJ zT{dWjEFGuIDdW3-fu?X!_!-1Ydz>q&Gl|UI?LM3aiwkVt{);x$hfE=oUQu0KH0ZaP zCsKZ2KVg2m+$5?n7F<0M-0hkmtizh1T%@WpM@XZ0GGBiucJ>IUembk;uqIOsMPNrPy z4HUJjVt0>85;R@%5hCvuChxw!!vfDzhdZ#?YloX=@ii9F;yo+iX$G^a9Zmsx9!@mW zQX(PM)<4zOSu8W0LU~@}0gLfe{2)Ds^!3aFJEV0T^GNRx-bQ1wbFp&3E0mS@W!LC} zTWOe%JinmqlcysNCiKN_%ljckU)igM$UJASfXY@#@y#f^P`D1FHx#lQ(5V}3>_c#P z(pT;48PrpQrT6TNlElloesogGP92Ld*qP;qT=`Hf;aPqY+5tg$lME*b@S@QVm9oxD znSSsU^y3wWr;eLszDLOL388amnzxP?&`YpQ_}4g|L}C)T=~Fzxgz!%{P~QKIm|o7_ z?tkh7{`H(uUH{9Pm><<>$wsWrLIGKY$%H<>4Y(2Fz@h5zOEtnXw29X_Isfx9=FD4)Jzg=gdPc{$qU%YpQCgbiv*AenaS-nq)ES68B zDi{kA>wfyqX1YpUvzZOYlVeu|vbIT9IL}zCizEt`}5Gy`r znoTM{xMV>z_W>S=^n|EqO`hBjO-#aZjg&Q_0n3$~*+&vPN)p|!VBPKv*G0F$O0Xb1 z22Xg^xGUSNwLHH+7m8g8r2cl%UpEe0!?f{GQ`xQ~jbWzYWt=*HN`rbtV|VUi4IuR& zevI-2wwL~lAaE;7I^y zUJt`}7iIq`ktM!W-NGmvI{@Z6E%&QkI64<`hNBeC_}i-7_fZth3v-k zlXvTW2$OkV8M7YJTXfLE_TR{+Bf*Y@DI_bx_5EFeD+G}jpa?$S(QPoHn?sPB<*#P# zMv8iZeSVsvxUr>VgD|(Qn=vh!A&nop0-ljri@6)BkU~P$v&j z)r}lunVzMTRIVZ+lL)`Eq%;UsOavO7qf z{~5|tajzHhIxlju0Tpc^Fz6Vsy}Z4`Pjzu|{#Uo(Gt4%EU6Nv-33iG@Q6x#Rj!Z`? zG1oZH+zBY=GSnq%^vdy%?JBYSsvsIkF5=Jbkwor~80Udl$?ExwtQ<(edRa8-w~OXg z{gj>A=}{>;t+mW`A~f|~3RDPdo?Y`SwZO@Cs~{Fur3g@TJF0@JEP0H1{H)eiAuMg# za>@Lb0vqLzn#`vmb0##N0~ zQm*e;=+i1L%J~mMXx4rc4mpg_#K&&^{_1`4{rX{u0rE2j#@b;R>`h}GLjL{aC+3A5 zBElGh8UKXgRzG(prSpfjIrO3apx*dQSMF9#aRhkZ=3Z0(pe)Eo0t!@rk1m~u@^6)u zofiy4Z`Zryik2t0BIHv_9mL`TQMz7V@Y(%$p?9G=wLykZ=OauC0e^weHAwlPdWjia zu6qpgf$Y;Z!!M-RLxWUPFauV`SeW+poZQ1(nAER|G~QyrUVTc9IcGZHxVD^DAd>;T zAR*-eZK=j~5it*rhnNESfYdvlJ$FqMxv7)>BAZOXo)PS_MN#mQOkcQN9^gO+)mrUH z{78l9)!(b$P5V|;@N?CF`$xxm_y5LKuWb1#)-(OzEcY&TO8}ZG(z{;$YRfPH45}R} z0LvudO9URWWF!Pw6!1Gdgpd$L2jghaW}1r`2NIg-;A?kOi~BZxKKS>sg0VTm_xYX| z>G1+SDf%WpnAyuTa?CoKFbv7X3|}9&9^Xy-Z+!QM>tE!C&X6aBMX-u2BDeW6346gU z;x+I^u`tCHf)1&cwn@TVkaZ%ZvAP5T;9J=OBv(eX`NNAWcF3voNT|d>3$)4CQcJQp zAqsd`#wfOm3r2pL3{u$BV@!!TVB6^7QM4*niZTeJWOdpkuaL}=BUN(9^j9Irno}#U ziYW7Dz}9tGpIN1E0tA$m*SROA87}gQfyRLN>vsgObD1*>M1X_ z*PHqObfhf;8(PFIwi+?jO6=0Imqaxa?n+vipKQ0i7Knjsy?|JyD|52KAGToSk6*Om z0$Q)`YZ+T7#Eqgv%fPgLI%P>s`a&l$0J%~*;mc5b9q{J<6FaG@AC8~82 zeBx3)3HZ<72}h0=moicclKI2zTj?Ma#;cuie|#A$PAF6C<_0k24OX4-O41hVHtdyI zqQ@bxmg^?vF6^2ic=UGpeJ?nUUGeZtP-=;juE8m6yS{2{y8%38cgr@MXNxwBXUjGM z1Pe|$1gq0w5o83IvO=eKHr~JygwXB3$d(>~+1|)JTwkTEw1dQO3dW^_EZ8|mly3Di zGkc!l7_42Rn+$v6a11Pu(0WS_@YHOy;>EvwAGNXAW(!SSlI^go#~pnejUk9h-C#(? zSKTZmAJGn+XtGO$Da`C>Vhme~lP98I2Vde_^Do2Hn4I%$OEB$HcW~9trJw`IO$iI_ ziFYRU|A?&N<^6H+hrXDG)^>MdAEOIPjc#It9Q>NXgj;qDy8MaLqB?v|YM|sZO3r9+ z@>I?MrzXt4Xv)PmMdDR9Iscfz3YkHh85;1n9M^8Q`U82-?6;FDa_!G~aeB#E(1Ejy z65tTWnQD2yY~|=`R*d}%Ku*}fm~(BxRST{@FtpR&tq%b!{1`FZlCV8-%HRcnH*)yz z>+#&!=~&Tt2eLQi`ZmVG`P_8;d{;#NN%-=9X?1#|w01;uz5Ou*o@4d%gx=CA1;JJX zlaAl#Hl{K7rYkoZU-Essmp<7b8Z+c_cd%T{bMKg|C+{oUo+K?v zX8c&kBEv8?h!+vYf+P+Q#`UG)a_;XLgS5B$NWdQ!zXZ9i&J`v9 z{-Ui->p<9N1BOu)vJUR~O#!*DJV|5$m;tn>-IT|FoD!13&e4+D^)=3^Yu9B@2LG7T z`vQl4Ds&J4u7uCCptJWzL?zth9|dsnK|*y!-p&is?jlilxiS!Mtqzn?+Bew+1HUtw zaTpIPO`)s4>=@9l201RanpBN~NFN?RqA^<=nwF8O5W5#}tEnKL_q_nOI0Fq?8~63_ zc{1fgpkU=RVUQslg}4U~*7WX>kR*;tQlh^BDH{_hus0!$JffTeU@wJ#qZI7MT!}-x zV;U0}i;=RY;uVH@F&6*A7g@*MCQ$#yHp!lRw*Wul*hL6{29&&W#XB22#nnBAxPN{k z72APB;d+fU%AF{lW@|%~%)Vh2yx=a}fn^V;J|ezH;4|nKBJCKE^n?W5#0@;JMiA72 z2pA#w_45br^fP!6^dkS^_=wtZMD!0c`k*S=%`5BEFZdBUh<)R(5Fi;LTua{~Jiwk6 zpj-z^q$4`htNc@}v=^zhAR~`ZvonQPL)i76->eW&K`y#(#FIi%7v-d|YR ztFn$bcMApj^p83-q#Rq?OqD+gxkrxJs1_uu0b5~X`vTb)RLr#R_^aoNa?G0LcjF}6(x zN*a{4K=*pje9n*Niep!P(@z{WHet}X?^fU+>s@n^?T^*(5loBp@76oF|BGW--O|Ry z*wD%3UlzM=^)2V`1LEH;AKOfNTdF2(EzvsR49LAk;1KBm;H5_qO0k|b($=w*DZAAz zATR+WQPjniCncO~MF7iPf;qUEmABspG+EF@eK{zYkL9L$)P$5&1B28@;A;dlEYF8lz z-Y!95n_HrR-ip~W;%Ya7T*$6)s9Zj$5uq)mJhfJlKXN&T8w;1PDqw8m8o-SS+^M45 z%!9?<9|>lOV|07PqLh_SUvu8YkSpiltSDt+Vi|@bC5EFUs~V+SI5S-)+F3tx-ayM% z&C?o1w4`J^U;_DsKtN-+o+TnPb&Uot$k(mf=Wg>&`_DoX1~I8X57VAygp`nm$427%y_en)mX>u z6eObDq+QNV-9s9PiFRtL^=DKtbGFucqAqh4$77EXCJeo+n`Ip4z5;2@XE;($lV$9Z zgs9$CmsF(GkeBpKZpWyqw(g{^X~MeH1w<@oIZs{$P?b&@FbAYLV0N#|u2Pepk;+K7 z!wxkf!-+QM$&Rn^v;e+k>N`hWxq1+uN==;CRoAQHU083f>IYq}+8?!*YLQ`T2dpU% z`C-O+W@bgxsNF75IdSw3SP(8K49s;53^*uMoi7!9h5GapQ;ob*!?Ui{iP4~lazDEa zQ=LIFtkj`li6KDkZbcMFd}2MGE%SQFDz&Ie7~?volS1bfqsv#XQPM5C$R!g_U~nr| z3vEFSW|!gIU2$YY%E{*dtlS>TQKk+ZTWvy2BiUw4*syA`($3E;igv2Ynxs}$y5)m) zOZfpGnx93-%OeaM@TOL7{99PG2&q?iIQR@Ou%8NTN@aUAW27@kLw!RnLuVP3JNQSU zL>wZ-u8Y;OIV|mBNmLwDdz$#7Y9tuu$?!n{!WtgP z#X|L^OgY7^3RiA>JYGBL5AeEZnh-{*4(?HItX9rUG7rf2NU#X@tq=(gT5j8?>Pnh+ zFk;set4WhfRa4-5zpQ1z5>MYtB5pV7=C;0 z8T*!*eR>4g$c3y~3~~RS1EtRXD%fgI<2j`^d+pvCcy~pj7c{FYY&7@~!xSKfd! z{98RCk%(0(SOIC(vdY+ec4FEnEqlN-C69zrsyVG+ZrCvu?tn<{=-sVZI9pnKBE$tR*m$BU|xVNSn*H+R@;{=-9~X{&e!cVsxD9t)=~ zo>~4irv`c+dg#ayW^6 zQRMfcJJO^)hFRge2{`eb6m4!~<49k8h&(z(XxGMsH;3ABcXOA!vg!8R{q~H?F&_QR zrw!P4kupWGW`Adpw4}!f@m%fh^H$`StY;fW`XHQe=Up*N-U!7T5K)Kh{&5@Q>ou3< zOVU?@yQWL0MW_3Ip6tcEe&kDeGFd zWZzxNsrNb7^2|lsjKMP!U$V0S+bni)l-z~m)|>@_imU9cWI@6sps78F>B-B}?VBF+ z>)V^ZK5qy>?gtB$MjoUQpK11`OPWkR+WqbY7DFU>rvvU}ywrR3l_D{o(FG}FmuocSdep)Z*fI#lK8APwE7eqxO3S~ShbyHBZYF9VeRl1&^C_QMcm2# z=UMT0n@W$&XiTT;coGGQHKfCNnx0A3KesH%{lyoSvW&`Mv(tTkGh1m&i}gQ%W{u5Q z6f;ASctJ6Es4PU}AGKe-VCurl9c)f(YOT%51_?nMU|uWWY)YBZz|VA4Xi1eH&WM3`g>j!mynL?nxyo?&G+ap|4cvc>&bM2HLqdd}C$`5$d zMjS!8@CArj`~q@r6N(E7 znZsIWcJfg|neMFCL?=L=gsl(N9hj5WF-T~YfE##(8A!QBJ`*rRMWY4>yf0g3x>6Y` zji7Z>MmQ}hQsBFzZSfa(f=!(wtO87Y@JNh2G>7?KGNRrc()!loBQ9$NP)&UZY8A=t z9I!<^OCQUZGjB&fVUx2HI`eZ(KY(hbJ>-TF9OL(@Bu7Cl;!DdxnKn-3oGN&X<8Niadr0I{ z?`ZOGyzj4)9KkZ_Ap96$R88SnpQ%fc?p zYqqcNU+&g7v_vM{5)E{3aN=MIgY2)zQgZ#&g>BsE22|MD`{4aSZ)6iiWK8q#-e7-ur(epH<|HRYpwE}Yl_|ojb!im$x?GUv9l@e zB{=0=ax>PI2yvO6b6d);E?F%8;nlrp8Ks@dp-jdLjMV5dp`Tx#0)YeZw6I?5i+c^c z2q4b*>gXcW94$5}jm^VItx(ynQ%Y_> zByhiX4BoSsi@d{pQRn<7K(b`I4N$LA-v502$!4yuN$Nv(W@OWjB*my!&b) z%m7}bY5gG45OW8(EBRNk3#zR-5W4~^QAQ{7goPAoEm2b2AMF0hJU&r)Ug-nleSff` z$o+s3-xh2Sbs%~*;R|%F1u*Qebn(hkS=u`&VUAhu+#)bb0?mNMz?oUMW^%^;0Mum- z#7d}e!$p+-K`=Z)g?OvLij`2iTm^cPb=YMMkPYpitD$-zx32VIJk{tUvspWoXbRxd zF>2Ng32c~BJ?WZVasZkOv(>I$M?lSM&b8^~TPY%%mhg;eQ%J4xvntUmGkVyE8Q|hH zo4+lPFY2xPpy>sf#P&@dep}E+@0RXhLKQ95K?cpp0j!mocCTgPl%MnTNA)fZ9p}TI ze{Be807sk>(M%Ci1o17Z*t_N99@gbRBj#^s$vsczJus)gk&*{whj+}=3k!R|dik~L zmOgM8X9{h^LgFP<)&ztQ!C}_mBUBpwe5qE~?ZFUy&sllRm+caY#od?bcIc7aOB#cj zL;F+Y^|wk*-bp|T;Ir;X(RmT12{LWIeA8*6B;FTcu_Bv^(d{>@xX&KO*S?tt_|}tK zyc}!}(iZAF&-|3aV>5__XWhFz zhyIb1e(E+MwH}6=ND_%eYcZ>Bh)-b$G+y=%X4*$Sz zEV|W$b_zU(&q!pA{OgTh)Si4Slz}jp1wCQn2kXAD8OnSe-IQ3ypH=Y6dh}=W%k2Zz z|Mm&vPW$7{BC3pT+#d^T<|o3Qp?yxD&29tB@Bh%)DE2bNW_`cQ_@Mo}^;q>kpFR8w zPiR)R{YOKZA32m}Lsg&(Dyp@NG8|%9L0410q{l)N(&Av#VvAcNR{y?PP$v$pK*(2s zpBOKMsDk&)=FBI`CkkIT3smhq^^e`G^tJA1{)bH-_v@{X*O^QKpv^%i$R9q%MxgGf zI;xBn1!z!AQEY?&M>Lc)SVL%ck+#sHz*;n)LSYf0M)^(5gUtG@p^#1Q(PVYjhhv^E+88>y8q2C(NcITW9mldEL}b*gs=uF62yn z{A0I_rp^p0+D{%eSu+eHlluijk(*C0Gqh_;21)n4B{HjN11D_*wm~D;PQt9wllR05 zU9)(4YpFbr;AB~HMfeIOSonNgU@yA~cF7?)>5?awyAZ=;f%#0P>pmSila3T5{Zf8o z(dNgP9;D5A3};L-tuXaXCuwd(+n&%W8OmfLtqmQ<;~>?ukgHztFl#)hlP`%*)iSgZIwl z1H6rXM(>W^;TB}_*k~-Fe7Vm2P*^|OzYRaxk&M2h$g$D_*pH(^c^~z2)2RHw5#>W+x->@Lfy3l~V z105g$_W<=;lF|uDw)eb0dFyYu*!dcN`=!JydOwZ)Z33_cYsM{z7)@3_=W->4@=G?n z!BX$Z+*H@d3Uismt*wx$Y;0%BEXPSQ<<_$M>nh}CwOZS{7p50dx=0Mt+-%h=p9;i5 z3O#3tau>>h-N>YcUc}mL`%KyDv^{Fkk6D#@r{u_FG``%o;xl<#-1#jj33t<* z%ShZy=9`V2I`3FBq37jIbtFtXyd}%@91)2QpKqbPJD=yB5B^ohZ9wOAI64^zpEv|Q z*LHc#b`ipX8e>x*$2$2q!K{naBla6}tq5f9u5yCgtTM#ZzJe}@cBnnfm#UZ1OVn^) zlCS)mAvVoh>t3S$(y`!*^`b2i;iK>SW9?j-YLf#V5>+X_sB!3r>29gN;Muv|j^ORl z-!z(2^hKm(ZobDFjMfU#FJcT3R_(1!#nVV2EfspT*>yZ!iBD)@YsgQ)F7_fFYn5AX z2s_T!?{vAWKZY>T7ZzFp!rYa77o4qu@W57PVdIV{1g~{)`J(yLU-Dk9ng=bJ>NY$2F)?9GZ{;U|u*#`wtakK>^p@6B?;w*qnU-v%lF|4xPfuX=B# z|DrVi9~9sJijQj6-}s36ANVL;sDWtT+yo9;R0e6QMCeq%2x&!Jy}n_BHJ_gex3x7p zppaj>^IjizvRhor=W{J^mV5g$O-h(ojZDgAe!S&rKjXdTev*4K^99cMO9>VUHXU=g z6nq`d$84W--fFCgFknV5%77KXWMbR~a0Ed)_hs>NF%Y z-z67$c$Dpl%f`wz89mWKDvF>9pj10KQCDi{It*)Y0Kp%PsQgZi)hlYdnMlaI9}K(= zwvJrPrmLuHAZ_S%P%vo@yPby>U(sQAcW0ha^l+erFPPXYht4&mpY!F!Cq5_|aG<5o zWm2ZY2vOe^3zdhx@^TBvPa37WH_dTs)0RF0QRpakdCvb8enQRee%wZZ2H=hho0t&3 z)B7RxIwq+OP6A7zALQ8K9n%yar5I%aml1#!@u!0jXx^-@M7LlV z&j@ft#Sgy=-_hsP+!b&&zJ3W{X3n_7O-){iwtA#Fwzg^V?h)f7|@A+e489l zOV_m5698fLH^s25FQxt#uZQC{2rQ-mO#3yhm9Q=kHrIr+qf-ku2+lNR&&v37G>%L1 zhKY4eeyCV0N7Ciyv}MbH%k#OfI{qjyz{)z*pzy zH9@w7P2soLd`wv-Y!#l_r2gRM7x(Ij^QC6I^ADhMnPHT#v-GddOAwa?E}3vhZ(>dK#JxIOV=jx z&bHo*b>Z>P%g>*VD<#Blbh`h~^&9+$%&#vT7;oQ9#{25BP-SlCS zMMbM0;iBig5H3?MHd+I)u5qo)VQfd+^RsGpzJxq+@7F^MIw4kB$_wOJei4$YQ^PRk zJ0N>*14ii zl|1Y7g0g>(zynH9qtBvp4ylu^Y9vdPG}4nq9RC6or6_dmpOTJ+w_=35|Eb-G>3^9l z8{6C1m>RoS+S~o_8IAtetz`erFa6UhBxG!C>g-G^Yj0>`>hv$8rdsXB8AS}!k6p_9 z5Zfj%Fi@HbE{(junYf@uP1uqwV_v#m_;cvEAn_&F=b2u4U5SUvk=ecT#`~TB=HY8~>*L|^S>T6k{y1Z4uv>*KT}8E4_0{MxfFeWK zvZlDU0HH=7CFa6A$ALtb3euzVu!9)Z87+53)F6OK=K{_`%=x)ftmaUBB9i||dPxyt zb4lHkl9m*!VS`skbuaaKXPLHk4X^3^e zv0SHC6@|vO7)MyfT?o1sot(<6z{gR4{0Ps;ZdzT-rc}|qW zBrVe|&0LmIuHkIY?Q|pf`VHZVAsKn3MX%x{QH4 z26u61SNl!5*_-v%>qq*?a zUCqloW3ZtFdSrL6wX@;wQ@!(?|kB0EBC>vAQ?MxzEitkL(he0Jb6haNK|gj zt%=D@&5$^3RO*uYT$AKNeZ|G2uha4H%l6Xq3zaQfLo)FY}YyJmmI{X z_m`?7cF}9Sinz4ybg!%L1+m*Jd7T@Jn{1#HO_gXLekr?(Dk_b~qKG%Km==p7dZLo9 z)A-Ri3 z>xQs|yM^f~dA{>No8HGooPxzJ+{qkuuLlJ;_+pE~fQe;%!r4CGz4CangJAJDc#(gy zyocgHH@MzQLE!=R3nt=?!Oe~#YQc>@z&<7+KG66*(v*>oJZGUJugo~SO@-<|ENIpE z!U3L;83LaY`S^hfHJJB;fz0aS@DT8`n4RR*{+Gx^a4^(?pv2fsz-8Whk6Ud87%^8 z=VV>IH{1IUmRq4aD|_{wEM)#~yCDCM!A8;5A#}QjPv_P&dx(a z=j+LseJ@CwXo#U2)Rl^smP)@>^U>%qfCBp)ZA_KL2sX`BIqeo6f^p6wdS7*YnZFR&g!ieEP`92-bv3u5TKFLrCU=sIbc!F-|C-e zv*?lf|Dw%Mc=%tU?qb&A_*O?`FhD(hL5o8Uk?Rg585(7UP>o5%zCr&mm@GdTrzPa} zMe?rDJenzGw2a3Bs7rbuS6+Pxjf>6sah8K`A4s{?9eZ!aMZJw>SCG4H7ujyc^`ERwHB7j6HVnK2Yc+0Q1NGVbtudEdsS55m z0C*H6JOF4GO{VqaU0Vg0OtR~FYWW=-;Gy%E2pwO!b__IMtor^dvAyaboD!me8An7& z?6=4vIOmUtU<{yqTVX|1dVG@DZk5uQD*A#l9sWHn>O7l;hdWDhBa{q~uRDxhwoTJ! zdZ4_?p3-W$GpHtFS{|leNc^GQwI6?M(SGJ+pZq>Qig%QrnLpn^B%2~tKj|yKgyi?L z+$@W+Ae)|w>|?Z$a8Az>&_jb>^n&7Hymt5$L4nC$K)vvndDK?~ z$9fy)%(j*B8xr8!B!?7#|C8O!f78iG;{MmcsCxJN5Q5puR*h(=p$gh9SLA2%8vkk?De+S-(?AzNRO$H8sxzUa)GjN zJONRndcO>T--@Dn(&N4One{tyw8_6Q@d33qniU?Q$U+&f?`P31vFUlSGgW~rCbZwFJ+5bj;u;n>P|T+v5`;svd~;2Q&81dqljG8}2W+^1PEx?ytAkxKCjSH)Do3 zfA)O2EhUGIUl<3ByL^IEzca`NBusgaB=F=% zU(yJ0u>889bAMBOLhf1)^Q(p^9I$j{B{@nD7a`2-MiH1Z9Z5i*q?u>bn|DJ_q}}Z` za^6rJ&3MjT4dF8o>s^|jKj>XP5T6hEVPTM}Jejg!ZKdRi$||?=BxrG0mxkjvHyM_6 zZXAFZLRJ4%o(Tq!GruXid3X?;M3pAIwb_|9MH!~=i}YhJi$Kw&FQNo4n{BL%Y7^&| zE=(cw*7J3Lf*||gd9S~1aD(@MA|Fc52)1Q1xi__zW~Ox%blVQ9tgU(H@kv|xetyT9 z`L~q@Irt~Yp3Bu^Ln(<0t8yE!dFAZOm^Tg5F&(h?XQEr!()tI(CS8DU6hQPdL9Ohl z)HEiCHkqUhtfH4OXs30GytI;j7sD#J`AD`xH06{2G|4Y^7Zvs=^it$03Q5S|l9pcs zaINd;*KD7cCC?@VW!TnnOO$Rb4!eG_OAvT&8KsGrs0y3lI}^u`no<<|#i5!F!$KD^ zm_=o1ky|I;TLY_8R`wTYXa*!S4tQ}J;!rsgQ7Pdw5yIGMXNtUyUL5#J)pw2{^fVU23f_l&5HDwWJMrE5%2Yctv z{Wwputsg;R$*ylCMnrZ?A#zyL2~dHuDxWIi()G%C;RSG25yaQs?=zRoau?&$AuTqX zMcCSskvt_w(8#QR7MD{^bU4kQuZZHUu(7k>`>N@&EG{(bIu_LvHis8)Yt<~$v|T@d z+n9oM(S;W|ySD@TC_kd<8W^(h^vs&{1P5gO^q(AGhw7f#U006mVXvbG^F38{0C_`u zWJEu>GZE}Nx%GsiJF-wm{0=?qg4a*FBLmYPR!6;*NR6tce!v`R*(ZPJf{T z+k)+_Hb5A-p$udEs0r+b?JYGR7`UMcE0F022@ujlPO9q|8DF$&-gl`UPFcCu^DEjNd4X#Dt0FAHHCHwP$4+~0 zeiSi2BR>IMP0jDzJO0uhsJ|L=t_11fkrRN<&M`ieomQ!`H>rQDs zFS9>Y$n00Ui||qyB|!DU^3{L*rP{Z1>puKNlt0`cA+kIx+K4=OQXk1O*tA5Bm(qm=107baj?}|L*XX zlcoaARGfIn4EwO9yClYxe_?Pj*xXf0@*>;5Gs57z1-LHvh>n$ww!)fM2C`u7^t#c2 zjc@RTIHj%GnAn~r1&(DI&AriN1Iw${I2GoC4IL46)o4*z`kX|%8Y!(+dLahXML|G7 za5r(S6l}S@ei3^P63|Q)uyC~U(sSyBC zcL;fhEi#Bcfu)w88rOzGs1_N_CaestN99&C6dgtApJKiR-(xYpY?d*&bibzYz78NK zg^wqIN+AA-Lq~zo_Tc4&>kS?uR46z%aX=ntMOU5mgW8J(`=a#M?%!GL_oKS0gn2jZ z($`z9-TfTz_d~l;$9Q7v(pO%s<>Lx+y~C=CRoF9KVi1U2-_`8er)8JjOP-k#FN!n* z(m0fYj&z`@35@nCst3Wk6iuN%K~xs~ev=@{z!5C;MbyyN z#f_`f$t-H5_kGRaellCmDr$?oG0qwH-Hx-5*#l}zV>G?t0l0^yFK*-=s0wd5IIb8( z%ufVdGVR;~YHp&-9r@;^U)7REIx1F9E!c^SR5C6z%3Gz7m4sXz$~|quwm;X<;MKiS zXhfQHip^9Rj_&GECJ}{V5-DC_brkdq)_9X#loUcKD6gCm)O9M9VM6V5)f=0DrchgW z%0`{wS_0`=zq&a=xb(UQitUsk$Q`dx^<1%KKy6F4xANhSEoH!LQzf=)@JAO?ptPKe z*Ylo^Eonfj#neQsc1UYbnp6Xq&sA}jaPEEB0^Pc`%Gt|5J%^hE+q9FHs;y{eG>g4v zP|~H%pps#m*^^<|SXH5$9cibha3a0SO^qFsC9R=uO_6xup3B!dok&z^9oSNgS%58s zVQTWd%hIniw@|Yf@e8!yF~O#e4qxau>2~>4G=F0k*cbh3UZ_@)s7o{mv$|mQ`3v$7 z_QW1Vh&S{dm`02K?;dOo|F_wbxS{cPvWzF`KdF?6ld0i9a%RNsofMrcZ7p3a-TuG) zL(QuHMY?>&u6x>Yzcddl+*c&_ZAxuXnU51@BxTJMUqBxx*IcK|lv}moUhe(vu8(W( zb2o&6PYTId0MF9Hbuf}>|8}gu7j@9iAtPrUS}vG4nZtLI^Ul-jeBDkV@bx+M3?yGL z#%PXXSJiZmU2Im|fX!0rI#Gt*QrT%Xg${G1H58U?ono34LU+yicAli?W<7mgr-&Sr zpUBRu>RiKZw&XH}M$)UrLCOe_I5YJXi`DGt#*|r~I`{CxA&HTT>K1%q0%Tu|$v`sd z_&Fkx24i~hq$=G0f<4Kh0R+>77qcJ+b=0fDmgZuUHp}D5FWRiU{7$Y5GJN#6NtzuX z^z6hMZcRx$K0ne{ciE`osCM(2`iR4>h~2wnA(mVnLfmB>G-u9~qd33N@4aoZQ=n+gRhP^ev>}Dt+0%kaFm8eo=*2V2CR1s% zWjbx4g}X&1+E}K?jk$vs8j3n*MG#?{*)wm(xOiCA7_Ubf&)L?@q)(?o$=I_Fvy;^O zl_35_@t}($lvkoy^-8|Ke7|9@_-eDvyapZUkyDZ>R+=zqoSS$(5X_1 zItdsXIbNvjdevFGU$f!ID&v)C5tQo(!;YfSky?ASUWG1kV2>g_{el~GZuf8`ikBIF zD7P^al9?jMIPEv1pV!Uu;P-=8YMZS5px@fHqM!g2YFAJXT>oKOF*{E;r{?@5qs6Xi z@k^WaTnLLFnMhf&HlZ9{oxnMXW}GWUUyt6c{V1A-m-BEMF z3W5gTkQN(`3(Rk6pgi~$2x4ohIV=PQu_2wz%|!I_SR}VG%34V_Fm^#Eqw{TTZiVhJ zcG_Zbvpg=S?vxANPENALiD~ooQ3+|*TA;#FE-}p#kXjW|^e=q(5tsoXT)P?jp>X|t zm`4%H>-jqoqFt1rS5O%LSP5?zCDP^XX6PqwAtl>9eBxoQ157-G#~-Ew{e)q~Qgg{F zU)e7T#D@=k3cx1z^+U8zv~uj;!B>y#SL<1MQ@2Bg+pQ}%o|jXw=L?m@J{vRl3!;52 z?AFN3==E=3*-c%MbCF*;0!aHar^5`VL$$zv5U-9ZZ^B@64^QAWBvU+K=teGhZ)LWLp^Tr zBZPC|${NhmFaXv<%`$Y51A&a2kYndjvogXAGFBQ>&_P779H!0M-QUse{RS08Z}Kn` zbcXdR;XPc2^{THt4X@giRzrd?4_ZvC{efz*&5H98N-zMmByElP2`JPB`J%aH8L#~0$g#O)tz=edC`-w)V#K);w|(%Iy}izpUfdXW||6{A z9vYv)zh}I7%Yy4ol~mQri@v>mC^PubT;uho3>)*iiqDs?b%MYNaMA8ZQJiw6Qf0bb zRRYCBMw8B{y0qD9tQx`898HXDMKR^T8 z@=o8BS+7+{anpn;>Q;Qfl7$yr_L1J5Zo5jevcGbfMy%5kCH!#i z2cK_VLOs#K?PEM)LMkB7Y?qqsFdtbZNpmd;c46*vFQI(f17<~}4bX};U3~w#*nQ=~ zpSV6*Q)`RSpq+m8=wx-}1~A-vP0RFvxT#3-h%H<4T4UD1r`~}zfAht!O7A1%(V?;c zEw6^bo*^Q(TKNUt=(|M*|o@3d+#Py z6))_GEy^TF#V7Q&0B@gAIMx#|FD<=hOB-4jY(pSe>H>b9))wOOT^NF_(%hLMoMhBN zfDgpturkQ4M0EI5ksT~!vI(9mtC8%kDml1wOeSVqt=&S1KRI3zhC$~I)w8-6t~aZwXWdbGBAmz zV5bvHBQ?MaaKkR&4z%srrfJbna4eHA_EzoZqN#X#we(B>&P z*Fna$fcRFq{JKfVZh)mAzvcV_L4I$$<4f4V2dWINxQSspUdTJ)S@9M;aZLQZX!+x2 z!4`lJciul^<^IdRtIi#$ydMMVs>PKh?67frz@DE_zJK1bBc^ZvUA zQ4Ec~b-)X`Ux>njo_CQ-0N>O({wM5_*U!Ql0>q3t&;Tjm_0^H%7ujZ%KcTs9w4bX5 zC#u9;()F>?8Jtq_(Xrs=%*vcWgnGX7!K$ZR#45FrhOQ}kiD5xkE zhez}ier{c}fNq+5-G(|HW7iWX90UUYSEz6l9+8kj(qf9ayI)WG+MW5|m)9$vUv#`> zc`<*e!>!RY+UyQWqTz5_F>w{Fb6&L^60MXvrJ=4UeArP~a9XjfvQ;4VvuA~ejN;@% zqNhUsB&VQQ9vT{&YCH%2_GWnuYT-D2@*b$`+`)gF>E3Q^iROV-qZCkFoz6iXj%Fq) zc(q7scVdU;HL-FnY6i%^9n|7t;W>%j@Lpi-ob239fcp++?b8x_T z#@&=y=)+pHX~NX|&^~a?ASI@^@i(*k;5*gQ8-5d8SA~OjaUYicQaC!?q=b>@l(USi1ye4;6F# zanZS9oL=_IS}}vht0?w>X~I$eGZLB3*j=0SD6Zk0 zFNoWk(AP;>0ld_xHbk zwElDcTK}{1nr^j!B(Y&`mA1pmiBPp#RSSj)F9aixXSbkA+Y-gK21pPhzQ#?y_N3eAe(KJ=zV8Tp zfzHO*gT-WKpva-)(P>JSM*j3=wYMnDI4g_EVcEhc*U^eBaRTHQ>*&UsmJj){9UWE~ zHPVpcvbnkmvi6aFtT2%1S}FPsi9eLg;!)DYj$TIbrH(r$O`;5g1Ero z74|-sO{Fg3aAFxaG)EZkk5-1XR9_>oH+pdCE?2;=i6XhrlNOqWnZn9i)pnb9510f; zf#a5&2GgBoMUA9S4%WpbdDhO@x!Z$TKsQ?dt#&9FKv-en zZh7w;qt>ld41<1AkRG{0g6)b~BUaXn_k`D_n0kN$Fpg(&K_ZxxUA#5e9-Aiik_4|* z2+*2fXy@^!sMQt9T$NCbOnuD}wdp_>dgl@*paBlfQ+v#=_ zwH{&LRsrNj81F;(Eg{k35Q2A5U@Pk4HQKZ(+Vl&UDd&p?NbB}yNe=-p5R1V`Hj6l& z)ag^ofUSobtRJ}wI?8cY;f`=c-xAl`|Ko%&Uq&qQ&7d+#Khg`&aB z%@qWEL1SeTkgWWi)y5;&3#PXGa5){~)~&#?unzVE$#}@(`ZJ7Hgr&5D*Lc0;ihKro zi%NVd(6DT5-b;{urmUZpvM^?1ath zGWxEimz2R6t2P(`m?PL75dW~MrH3lEo+$y@V^ldeSfuNDGEh_W1vyqUIom~B25Xrn z`b@Eku|~5CRci7d<>aA{0SxO{G+7CPB@^^=&H^p!##&9jl5}VM?bbl1g~P?fP1cA2 z(Heu|CO=(ZR#~t#laWkOv@w=PANs^rh#G+dv>s?VSJ(TTzUEl{DiIdf6)Mx0q|^_x zy-~cTV1EhDt~+@4FX3beju(9z{m7*jJQ-uu!TET)P_lS@;Ch&?RcoZ1cs}Ag5)TwN{KU*~ z&5M6-NZ+8C8{^*W&{k?m zSEM-l>{fIc(+4rUDs%E^U@-GsjyPopw?~t=wv#2a&d+|2rXGjQ<0!f#Qe7oNs<54>GUsLr&}Z38)pdZZ#1npiD~vKJgHp%E-CdYa(Grz+%J)^ z%NOW~tMy?6VQIB{jdhc58aH*RByMfy7% zXv>E4GYy}A9!k@nwizbayG+!}%rKo#NgOb(@L5;;iepm3U?1k?@HV@l$`0b^O$VqPH2@g zt~H1#(0r5x&k~CYOTnHf$kl-HN-QC?aI6T%q=iK-1 zs(V+xz5nLd995&L_tARmt+!?<_lGBL0l|E6&>YC3lq)lSEMF_oWzOk4;tKhta#b&w zE^Z1G(9x9}k5ByNu;?5gjdP=6+DB(Z*P5VM^_m)jo!mwF%YL!)H2w^XX+TOr@_dxz z*nBzzT#%ib8^pPWE*eBQv*}WsNI-W)u7$n}T4qtbat&^R9v>DGJxd|s);^m*)?7>Hp~PL;cT;88o7l2L&)q>L9w*btIVa>arE(T<-Z~7-g^8p} ztjO>pY}mH=lJI@9B!`KO!(RFVtups)?#FCWyq())J)MKLc6}H2`SH&bIq89LAP@+{ zqm><7PyU2`V7_T1PSw4JyVdhv4O9If5iDNWmYvf6tysso`Aj#97>-ZcO)fTlZj@EF zskw-|y=1=Bh`>(Sk;P8Y5%68P)WRb%aH9MHtfORG`k^MGdb9lFL@p7mu^R3xx;WFI zo+p~OY~R8aVt}!AV>oilf!J*V zDr2!x&a=6S&ihB-hp{ws<0U79v=h>RVEG$=_;n?!AV7U_y zl5ewQN3!(EY^h|iU2Hw2Tiqi`*TxrIt#v-vITdaVt5ug+))#3#iqw}qF!^?m$*aB~ zFgQK%V*<3ncT-I8SKc7E)Zl=WE(x=cEmp1z?GhM1aJZVSYigGXopdyQ^oMtSg4^hfcJWFdom7ros3RThZ80LngtW+wXDnTYx`jvDFRH&zm#Np)7Qsmxw4WoaJh3_! zzgD)VV(#89X6&ek4y z6WNrUw-i;{far=J4!z{Qc?ep+2+)G5c@mb1NG(h%)KD-{I(Q?}M3HsCh9H{$K<5Mx z(nU26UhJDgCi4aHkE;7A8*Mc2AM#KXV|0ctLz;`Z4n!?_iZRLIh3n`W0@iO3>h3$= z%J-iyhTpS(kJo$0cdFV-Q%pyd>(hWq4aCo-*h#-F5$3mAabto#tGN@v^jbBoS_&5o zsC8XYcLG7KYPnq}(`!Pjqd1_H>!W-vBGGpm94PRK5PkyH;U>7v*PHTfw+CLoaZk;@ z>MNY0HwmdFBky%p)=q*Ny{bW4dCjg3l@}~O*qsaa5H|hX<$Q_7jZHt5RVh;*NI7By+5Y|^yMoDf;M<`|Y;HI0wZKlHqG`VCVcHuBY zMFz$wjzkWSPuf>_#t3+e?_vG>$flzw!;Ee`@R_fgk(pTiFros5fAU;XRz+u<8WUQ> zTSC<~?d`HWbCd~uu)B_BdDStD+An@s;?cbP{^tmLTaxwTC^mMAljQg-u<+#^yry=?R3jaJ?J}DWYA92B?d6MdDk$=Y8+K zdYN|?F>eQ$CapSrU5G#XJ-$UCyI`K5)906SIrJ&9BmUcI-XEAfaqd@Fr7*{1Zfup) zE{dOxM8U6h7mW$0p9A5r3vYz0eU z!j|EZwCW@Sf{jqG7V2~j9l50&w23#VaIjFX$_(Xn{Kt!uTleS(v3na>1gSTqN(;X}A-cB)t@ggxcnKS60bYU}oCN3Jf zM=4vZYd~WJ#fIB*g3}dMi2mpjg_PXoNELUg~k{B5mcQV-AteX zfgYrscxzCinMUVaJih%=Vg5Dp-S9_6iiU4{mZt0id!Bgn*Z9o)i5# zT0bnUj6Z(p%Fp^^OgM4#J`a(P3l%=eHL1qXLefG=muh#qta*HT2M)Jk{56A#ee`TzwGGr$rV?BhtVP0mvA?g&F?ca+9HMk zl0SSd-*_?4F0vBe{F&L;-J&|*(6`|F3xK^gqq^78J9?5~-qKM$caOL|7Fa>~y`2sO zsD*>3*HWLOcWgPix^F+@zYhtn$C9d33QQwlyO0RMptgLTu(3?=#GuES zd&Y}d=-@hF+DAfmd?g(5@Rzv$s{3rdM~BbmPd>a9PNwxdxI?rjdsh>LUZ->v+01>_ z?aT4WpfOA4F`P1N4%Z1ILt96 zN-z`$y^W(`A+ef{%4%`CxU6iVA$k5N=7T)_hjX)(43uICPG!I){{6L_oxA-7L-nVa zpE!mr-5A1NQg#LhrEDgvw&_a2wxGj61XC&II{N4fD6L(tJp_vEpm?GIio$%!cv3QX z%G7kJ>>3dF$KrAKMSJyKQc#*z^(-UVOGN>I9bhcRT8W0mo&krxOp zyd3a+j7bOL+tBJpcTV9G>H5j(#5x>f>li~eTt#Y-9kzSBH%{RZ^X(h|7AxxA# zHf$F*FuBHo8)Ardj!7v zoQNA4&3WF^>xp0@Z42^f6cS26LSAH=Xf?>0N!Mr(>fdZ4U5bZWgXf878>Vp(*zdRd zwRL>v?9q$h>1z;r+Z9rtUSy^^WsrF^G6Nc!9?Kn=S$+g61-Wa_)Y{s10qM5euI42( zjl_v?TpC%~0@}Mb<$^PC*lndNyZhSX7DNw9VN~aiHtDoCEMZ5B4zGe!W@U_aE}zE> zyXWllDlui)B;VcGD0M|!fTJo^p8O#+2)_%g*_mgM`gp1e7F9XlQ*lFf_%Bfe3=!Ka z#l7GhK(FBE;dFe*fz=Z;*2Hoqce%i65`}|Nfd8{*8LDa|RmP0sphh zCgp$sIl?xE&d$R2|Mk?r6f6I2wFIR!fd*SiG@6Z- zy96UO-*VS{{LWqB$~|h>^IW~IvrKF~ z2dctNERQE>pvU|K{?eg`gN({`%eHqI+nvv7h||SvDgKeXrR5wjjlXa)?l?l3BI76h z@jcU*U3A3qH)K{lVb*3I&2mj_eYCtz`su`SFSQE99GlKC3^A|Zp-6HB(LfVR&VO(M zN8!&&LYTs*UqNs!SV?7UJ+sbc1ade?VRQKiw%4Vfy_LCWIOjjT2?#^JLUdTIu|B+d ziFAFc7xBqwymbe*66vflMNA|0i0JYl_cRQgG}A+QRw1(uw%^tS|s^c z=;oJ7Ft(iK+h}rbxsbxW4XGSDppe;jPac?GMon0D*j)S%aKhXS7-P&m`A-n@&H0Xv zKgM7g><^eh*6t0c{D6tKb{qm*=E&F9Sb_U$*og_7c}7t&&MN)tc!~BM&+MiM7_nAl zp`@+Tt`@ldux#ycnQd3I1jECns)1aWEn;#&3j)VhA%xpeL3TMsO_vi;w9ixrHvVjm zu#t3bgi2COg#K`R1hJX7Hdm!B(3*Kc9jhP7ynNFIWOs~E<}{Bs^2eEtwU8}@qXiin zFN`EYllE`*wyYbBCjX?F4XOLAJbAnV8pehGU6z z6H4onrItt4t=hy0Y9R_ykt^O-sLfu)VRf(U-P@8iqz`suBKVYb0GVsVByr4(&D_fF zivuKv{A^EdBVOZE&Z361X_1AKURJ`7SIpG$>Ev8u63-W-yMrm{mAA zX+O+5)+aqfd8(=T`pk*4dTp(Oy7i2x){2S{rgU+f4|vty$8GICP5r=lJK5tumTFx5b-jzb@3E_RmOAfnPfFavRelFB1Vq{&8D;PN~@ zF`I?Q_FyRtHC+WD0#p)H$Z!d=2$_-^q+{rJHHoK?l&PIY6eV}}U!@&R^CAi4vL7TKJ z-M$NnO(fdQa3otwnBR$d*tnVmcG%yXb_0e$KU#xvD6B~Fv{?TjF0Zf~`{lN~uxNFy z0d)1B!3-l_!!cS^72HWvz194mfm8`4Y~LY{bE#p2e9?Y<$3>@c@PfWk+*oZz)o93* zc_%^R5z)avIut^>nwMrf?s3d&BIFm6+lE~B+N7x5jI@IM7VuxjZwaQV-#R}QZXN%4 z{`>Dt82{a||F=&1ckH6}?1uW`=O)%rPm}Affdk&31R+BlZjk;pgWVO^L>r2&Mx;)t zR03R6+S+T(YGF-xDJ>2juV_SLtLjtQ1@%u?Rh&hPy9%nWxvq~v08{V(A7 z`lH!LeCoZg8~*#t#Kzm_kI|DQN~0w;OYhI^k!O8N7ONF}k=_iQ{0+hi3OIUe83oNp z8_n1w8;~7y8So(uU}{UxUcjg?DAlYTs#C3wHfc0+atFEx-Kff!>ts#S8t2+YcHA4pD>g@u0Y%tzTydXKQw-nEsdT}RRP_0+3&SR(~>1A3X@#GB&28&dYp z?=yDH!N~W{7r3>nE+Zj2U2@6=Pld>%hNnn)IrRQSuus~GcUc{+&?MC}T5LBvi|;J~ z9O+JowV`#HGj*r>MC4ZUUV4m4TG`Ppank3QEi#pRorO5M+m>9_kBG!|YXB&i@ViLd z!&v&=LOINvbi$mA&3S)gfwBJrGPxp=sjgLW_6KeT$z#&Xv2uU#6`sY9oBQ(#ai)uA zP3E}yX72sOebdO1-y;b_Up}PM2zVix_xc~7BNBvVAa`adR;{h_g2hxVGH&nIS1I=x zqSHh8m~$oXq)DI3EY7DW$vp-Pz`kCxV~p3GH$?klU%Gql*&8+q0htcWmM9Nq*EwjI zRdGY;IO}XuQWsJ1;F}lrw_1cXI)rh{7`0rfc!OZZiMv1Sx1$XX?rdXDbTkl|)^}`m z9gF)a^9^QXO+@ZGruxFBzs5=>XXXb>rHN>rv)@4D(!f487xL4mI?1Va+-@2jOF!YG zdKgda%7vkVg>i_UNwensn?48W3`>6eu^f6k?n66(NODpS=+QS4erTrC!9xkEF@lm4ksE*v1&>|Z3Cvu|SS!G^# znTEA6Elv!dhuXdQ!AZS*npaZ2yqgzNeL7YTMtt?p4-&*m8AH6kB7LwwO5Fa!!O&Wl zJqiznP$JI{&cRP6!Ev3)(@lbhgpzOY)!T=3Jbz%JJQ#YsZV@AXffxAU#y&sACd#hk zsDXteUG-AHtbRSIJFcGQn4au5e^_RfD-_nRdItM8Dd{A>E%9y}MIPfD7LLR?gb0LT zS&;;*HL;6X1~D#3CtAYEg-?2%uzpEgA8VDq%0akmV@SavFXj(5$ChJBe`+3=+9u(V z9>60eAkmRq6}u8MLjV2_qYtxbD^bol@oT;pJ;pr4J!U6TR%gdOHykhKM7FK>YLC35 z`>I^l`>vn5iVZbQn8Qc+vRp(k8%B>bFy&Cw9X57qjwxaU&?8;o1_{{~bpuqE*-_PS zNBmNS;+g%n;DD#!?RF^!k4!UrV=8!xGx)5+CzTKj`E8>;wEKjP1>AQWt0S=biDg2G z$vLJa_O#b(+ed~vG%3`6>xp{Z3JMh?$>)2RCh|VMjZCw&AxDR-9P`u@eMhK(3i%nj zU%2mYdTyW0GjysQ=!abSb9yJx``arMnCafxmp$>utHjJE@=bZ}pXw- z&wltSz|RK|FChh^@EWL>sWnFMhcFN277AAodMFPIijtZb4-uWe!-t1y!1SX*Z*shN zy_H%;pT^7g=*!6JaSPy-M%wIVYh>o~Qu1f(MFJO~V2|6%)_bQ^Uyd-|oKWrC-8gOq zZSpTZ6|%^=FoosUQHfi4@dgz;#FQE3pmS+FIWum}~!Nv*O)AqC}f3)`=PFo0-?#W?J`Su#xr$J$Igc9qj-TY^8Yx7NS^ z1obzh{8`*NcvJi^Pa7hFb<#@Q%{m=jYro0#^81J}zq#l4dx6|!v||dE8G{|K=3MsX z%hrQEPOr!{Wt~yPTVw7EO-h~*q#7CJDm#J@uZLu_=Y*Xbv_=8+L?0%!R6rrl=^%i{ zyv+!gKN(pt-iD2!i_7ZrR%dv!+lR>$fyU-iBrJ?L^(e9+kb35&R=zj_K_u_6fKrrJ zaoU-wDlQZgPzN@Kl!alOR5=#ZF)&Yis#-aTorU!ZtEbd6V7sBCq8t=lX`(LqL(_y9 zA0J7cCCi5L*hHU|ooRfM2O}DB0E;L8SNhBpW4nAWaX!K|(4CeCF9(pTuI+qMY0Nn# zFfXwdzI7<0VF+kj{DGNc$~VM>aCgfN+8fweBdl+N|jy+_4|(`;qO3MzfdlflTy~!1!46W4A5K zu&(pZwoH51{q2s&359LIXGmPcn>YlaONw*%&Tz11GcQTP%$tqHUlv2wcywNO^PEMC z(Hu0(TWVI#Tb887a*} z=!iN#gs+cw<}VfluH&1Up!u4&lH~6kCBdSmSpy{m+>ugDAUe}RrXHozez~Ev{cqe6 z->#^kQBrbJ;^MBr)Q>33NM9G#vUG3rYdO8*Q@B)Rm>{g9h_i)x#Y4s9pL3nQk&Vs} zsnu#4hiuJ16=*1({m2-Bn6Ms4r^%jlZZTeZpMl}9W4$|wwLnMfWo5Oa-#agoDda+U zCK$2;oy~bwvHf~$!8N-4QV^wN_ya=L{Z}-#OSB8EkU?YyuTlb;M$%C2mgR7Mu9o%o zH`?t}(?#Z*!7IyD%=$d0@=0wUhB?}}@)$zX_R6b*`Nbkfwot0>zP6N zdBHA;urWPD(&3Wei{vT&BtC@lHoveB_Ywn+w7LCMMg4klc*J0}MffHB0th@BLLTpo zCa*$1T=78?2Z#3S`^9Yy$ULGcvHg&kU`+36oZUu~;A6gBV%-l$U-Xsrm~1$6D%M;S zC-^7_sAd^GAnyc#b(e=VSoEtvU)5AU{7lG-aUUL!sUf1d57Ro`sZp{I+gYi%rBtTB*2;rgGooIvf zrrT{+oAB`zen?Fs&CO9x2xiMCg*8-?ye6cSoX$}`H@e8KKV210AJw%YyKepZ;|0zr z>@cg~lTHyWa0fa*+KzZERu&&i+d`DaeJ<`2kR5CE)Y$En9AIaeVi~jnb9}4#NHh-JoDwDOHS47YT-f>nGE6ZFgEG&Oavbt#L zTO=zxH`>mMBLs15xNbz+HZk_xQoWdUn})*^fXFu~lKi z+@Q^TZpvEo=k)wBdnM;?i;9$Y zJ^}!tk3xYp&WzD>8R14gGg9_mdpMxa;gt#&Du#uWZ9jfcTq-R96F>Y#K@>a@%|kx3 z>$sY{C))g*36vhO(YvIv#F-NVF*6NI)I{sF>V;xwvr|WZ+~A%y#`q>1s$^FEC9|HS zF~WgGkW~wjaQ)NE7hb$dH2cQ(FFo?jMCV_SZ15XS*>W>{^Y=kj*Fn=;{RDm}(vQfx zzAu`@6coVcMf}v2b_)cZf`~p#o%e(-(!Hv0ZN(-Zrf=c65eNt3FyozM)N@rBWr)SZ z!lgq#t9MT^4wSgmanW3;sg5CCyD=o)jNBX?0}d?rQNOgBA~QHD^%d+B zMUQ?R?+nGT3rH!~Ac@7kieI`e?^x9XsxF=lsKTEtPHu9uPKB72RTT(mxggs(P8)J6 z-r=3kxo=uEb8tCxBn;ca>SAOpZhkIyiZBqA`kiT5W2jnyCU_c0IJJ74--%391to(B z_H^qIVf;4<4Oxo7Gj$S}QpXhjRPLZ0mCoJm!V*KE9;!V&2BiRfPDnwuJCD zNrK!I_F2D&Nq~DnDUja~1JiSqo7b#J;{lNc>FSAZ-94<)m-ka9lgJij9^l*Bn(wEv z&2Q`EY546yZk8Ovus64J4=DY{KCKEbkfpnNR}2LxULiiT=tr+y7=w0K@=<;J{11xq zWcNnEXg%RpFA_Ppp|A$ZGSHK-3S1!BHvDvbxyFWe#WN9D3n;O}66!Ah?k3DI94+p4sG z+*bWNOOXF#-}qarC{(dkMpZ}iwL`hCsfrVeN)CjKX8nAU0H=yA65NZ8C=xBw^2PG0I%JnN{e6;u63b7RpHSm)cIwL6Po?-^-G)hV8EhzY)$32zP1Zr%8vpy#4x&G+ z8djBdOSuZWZu@kJ8V7oQgWWOPnv?3nPrBU6)3PdyhP|e;J!;KXMW#D0d4vF_7aa{{ z4wXKYN>ws*HY??j7)F+vbYZY09o1(;z51v-5S0oR=-ic_2m(-rk4hg**i-82n##r3 zlO3ZZ^WxlWzG4Q04Ap!G-!sdEMIqHM?+L>!?7so1dZAG0kln4&c@?*^Lh3n0#ua`D zBii*)KHOUkBJPR)GT`5(uQPZhb3Fo-A#kGn_vZJ6{=E{>|h@J|G{jIGhn zyEl(2>8pv`VFV^|)FThL#ykpI{hGH|V0uIZ_vwPRu+@uq%nV3$YRq1XTHX&WgNJ>V zUwmZ6+B}{kP)FEz>00F3Egg1t%slcP14goyG-b-l z`!4tCx^y@(Tg!Lv9xzCH8^RpV`W$=RL?s~t+*nJSLhDYnSo*^84)BepSzQBdtZo3g zc`aQ4JwCN1Xyz>GUOy$=crHj#iA~lmt9Nk`K<8bv0~S)uI)kHOWz7|(xBfnYV%iQ6 z%M#=g^50K| zV3zSAm-TQ90O9Gfm_NpR0`@zAx=88|8#Bcz4oW%K-E9B_Og zn)(JU-tjvCSPzIh41btfB;j?)Dy%sJBm>YX@WivedR*a5491pSDur#N?oRFAhy856 z>vXthm_T0c-<@}mze!p0gtWADN1C~y94Pe`Na^0|Or?}snT_<8h68U3z*0=eOuGxz z$xA%(4$$9_e)Ekio*)@z6i3d;fxk_rpp1=a>wTcVUTJ!ci6$-KFT$XM&FU($mEMLN zg||tMi?|f+X%c73Tzu7|0mnDuN;vI*fI_$ZZRfB;tb;@d{2m z@|3OlE~TMGJSt-e9klY`in(#Ic^>)tiD_z#=yozGD__9!xS60OP2ji05yTX)B+IgF zc0|H!sX^~aHUZ5x!aL$${VPNCr>ocpSB>?LT=lS#6!LGgj*MNsQ2j(is6lIcYqE;1eya1sszh3Fb;e z5T*t68`#Ay6%u1l;a0#_IJ7TXPh&#ABMLSy3$`W0GVj5uTjJZ(bK}P6Hkfe*pooFW zN$Dupo76eaR6>0~gt~8+Nd$89 zg(g*9RI?vMLk^`J4^Ew9AK4r6V<~tY({V-;_C%SA5D2yJ;y*z|pe_lvo=4qWj79_& z2;{KmV8-FNjUF+?XF#31+r+gSfK)l05;Qy!I!mf7}*|*i7`KiU8;g{4LMuYzakC* z`WuLubS}o~5T{Du7`n4qWVfEv0pdLnJ$t^2tTGAt#*{TGmE4zrD%!iFM=;UT3ZRKY zau(klhg3s%T-LA}(B$$32I?{}M%mpC0Bb^364-K!W%mc>w>1}GSH>;PYKodfbJ-4p znHUpH5K&*IZ0p$N+MmP<$B9kf9?I|^=UV7TBb|3}ttXH7XmlpeY)WY+r0A`9n@jjkvCN0muOWQOR?uk`VnGN#`^cW-!Y>Q8I8f09~( z{xt3$Xx|1+gxMD07d~7TeL?Lc_s3ln2h8DKkm}+NU<;Hjyj_wShGiFngiTzlfIdew zmnVlDUF2Zo35Pg@7G6Z)s-UK0 z^%nwTz}QUb*wH>sdQZ@gWj<9fzFV@P)A0F-dDF<`IyV@L2`Z9G~)vxht)RUQr86 zzIR!Ac8KRgYQ_I>CB3I9a(et8{~Rv{+a^E3M0%u20TFIku?3F(fnvq*X9O0NOQPth z{h9Vd94Z+7gzUi0sSdc)g0?cv!V1O9jcAJk>BZuDE1D>Z(M6uRjdj*LZBSwzeZX&S z-I&`0LP&iNJBuVq9b%WCIV0F1uiE3bMIdJ4xx+tf=_I(rMcd?B)8Puz{^-zpOZ<8Z z+&ioJeVV{K8!t;FP(J&{P@?L+r1OTX1b*_!&m_iazjyS8U%Ko0hD0g_=lzY;-79eu zp!i8Y-mL=!f;Kq_pk$vW zQ!&E^dJXDvkJz7Pbqk~XqU?n>v8kECFNa1^`pUUl`T8%H4PPQ#D8`R|CHRm1>Oa`6 z{crv1?{G_9Tm1uWy?r4?h(fk)Q>moXvLQk?{xv`U!(Y&bRfiQVQ_5DJoWjI_8I=N+ zZTY$V71pOwo^P>U>!<0`pVIPj{<8AtQ4t9+Bbdm(tmnqxuV+4g0{q^eUy(jlZ$X0u zl{w>qOUOq`tbxgqpJ@p}u zcE=$JTl9BP1(7jhYzJTraFCSDgO9oh<{2UiKSR4H3<01_Q{>uf$Z``Ug?pwtemo`}cUO_? z?jgru@u6=H5h#19g)=pT{Y z{<4BFD8?}7l^@$L`vjwDU6Flr(9UVOeZ$POHc6Q$2^M@TU`_sM5y(+WAlrmD);_D` zS3okC6000hovfYAB@b*%CWLOZ=ybeN;#ebcYJ#rW;!LaSnsifegfxI+a?VAa0Wxv! z7b@0$f87rC*t{^61T%1Qz1Y;v9nYBq#RVg8F3UEaEqGsLI-}`#5Ei;})A;1v^Qlh` z5*0f16~3-fcEl>!(Un2|B)i5DPK;}IFGElkXY~yW2eZHYYntZ(Xuv}#oNk$?u?M@lBdPSl3iQL&0`w|N2Du? zagzktE)@ikgdZd!lu@tT%oRoh*i}AL4OpXVKN_C^mHXn~ehyt3(TgRtUdXqRUr@~4 zB!$3beX>DQO>)SbmS3fI%-3*RX{(=iRkMouQq0W8L4k_L6n==o)(&KL!flY+wq z;d}+@vT>}o@_$|(5TE`t@Of2K^ABHPYLAmspb31{p1`tM`3A2iAMd*>Ddic36mx8` zDa4-TFtjl!q5)T(JXVh;JthZJ$vGo!n_ZQlOqhf@Nar!klF%-r+Z78AyG*j&#M(%P z10rTJ^DN)b3r3G`YxYK&KbXM*rv3wB<+(Z4x5;~KaVYic`xnd_>w<)tajUHkX^XIdK2jX*{3gtbi zWa=}TGKG{WdXG20`e{9V$`{m^j?k^&Q&?KP6oyYepZrdGF7++2Qa1;5!M|5xa|)0P z$UTHN1zMx^k^WI^zvzy#u3G`ub1Xpmz5~y^E(+`@XvXlCu8r9Bn}B?c=}4t=g}Ym^ zOqBY)vhwXGI0K=?nH}>LapgtvpHKDBjxeF6cT-I(3xZk%PWSf;RKCf}7rH9%?|;Er z+GIpP(FcuJ@Q*Z}{J+2D5wo#31pdEp_P^C^|0fpje=L{CkJv}1XEDB_(bavvCbB_B zW>dA4CW%kN(ApkIx2;(1)Dx|ZUX`Ey&Phjt4D8hUn4C*yUDU{$F@ zU!BCCu$`{(*i?NzO|Yr(MR#Oaz09*!H&ZuFlon3{RN)<|nflKPQeD+E8!)21hvo&a z22IVFX?V}8*tBdYz|n$mCc+F15{OC-b0WM8g0b9>N(W zr5!(GiuZt$3vmg9LzT$4khk+fyu>cl5ts{6RF=)F`>kg+kY}xIN|Qj zH7NPUjv=Gdr3#hE9Rt&I+T9J-Gq&n1X0?UA&g_W2fECmD)Nb6wsN^$vAead~!}D?- zrS|Pu9(iKOk2DB>b40i^-icS;#Rkg*zuIlWx=k6=EnLuFxrY*}qKJkxY|%gAU*Lvy4V|hIQ%`(Va&EJ(1kp_7NSEph2(G*nS)x)9oJ=g8(Q$K0#sSDkaf zSS~mIe-U_SMmCrJ%1oj^Neef|7?yrgD@72xihs4Vds5sCt116HjsSLhw8bNuRPfHn zT=^a98`+T?Mm4f|VhQtF?35jb??7|+i+$R2NC}h8)VFYmN}?f}0_3gFip4F{Y2p}R z^4Q5afPtIv`h@4q2}5$Ix`)d*1mVVJ|F1+e*J6!Hvv#8+9##vj#0BzDd&c5Z!ooB z8v~+=H_CJ=RF0av-b5QIDb@yJJtAjJ7$hGWTX2IXHON9pR9!s=om3T5YsuWMOri;Yr9vOo0 zno5A-!Pz_~bHFYyhp=?3t*zr9um^Lk;X(gSsBF}9)1>|L&9=|Ng1twFcD;}Zs|Ntv z6%_e7it)AtWQwxgrO{?O9FZ(5yH}ISNKO_8R8nubIQCNv3H?W8yo!i&sUjixz#OF?)!J+}YtJO?;)i`%`mFJGSQhD5hLI)^ z)%hVR*1;9g#0KKDBRh~<%3-W5)x*`I&S*(a+0nao5YVe>_vDNfzaPC0%4l4{HEIao zje&rzRcSjbQco#-I%GGTET5hE^+0`aL$5~KS5 zJ=y)5(oN^i4=+s`PXK-sU)UlOm1~CG)H|dg825bS;nRV;6$aqRs*)NZl^ZT&%Z7V5 zpN{2K?$IC)O?A%3i#A<`d9=SpPJyuy+wMe3b3_o~`iX)x;z{vqJRt~xQhYhJy16ka zlH?T9>Y?SSTpU2DF!b<6Ug!Zs9;-VhnPsk}XpxmNizYwNG(3&^?xalv^y;xT3m2^= zTFyX&E<9RNNG+yWdXnWzAWY`7rjjL=eeN{QTHm4p?tLOjR<5XCUtwoatBmG}RI;)4 zop%5l>Ichqj_^wXY~lD1Xa5Q6uY413_)~(x4xb6)8^lzSa3t{IdeLuzg zes3ZszHk~KA^V=&erkMnp=zuN$hK(YKS@qUOW!F2j6n4)MC|9v~wp4@GkH zG1|qH`OQ<~2x=0DuvrshnC?~!c3<5tCZ_k@LH77XRF@EZLC)uVb#yz<8!PVR=N-_A zZ+9lPw@+7(b7s9h-C9jpDT2gw5A^~mMQ)Mz!m5RGP7=jK<{F@b9@e;sGRxV~*(Nca zI@n}aJw4=szaej5xT6?ZG=LaD6xmv37NF-bc)i;@k;W(Bixk39LW=x^O1-RXcwnU5 zK!z^b-QRm=P1}X~B`?@?;m=QPo$uDQ?G=JN0!zu>a%a82`_wNh5O{7uUP!-cVzmQx z?m|ojiy$7GC{`&3>)ze++LLys;hH6q)jTO13w@%_1-S%V2trcD^+>vVD4!fduDK*_ znPfC2lz3V!)T+bkQ@0QErLuDKK&37l_o1uIUcacuH#h!jadlgVAghmgS^Xd9WyOCV z5J}nrP0dZ6{{KOu4QJF3>odDV;80E6b$Osl01Bb3KOJ#k5piK1iljxZ41xFc`Tp{1 zOS87yg=>^w1OwlZG67JGW+$j8ljRNd81)4`=D<#fLiQJGz|iSAuldB|IM)W3`ON_T z?>DGTIDF<+WuaC*ad-wxcJ3;hYUn(=q*JF-&@BYoIuxiFvGxvP(J8-(+9YGPXmRsc z%^=y-oXdJ=-V$s>BP~}#KTwUN(O1E$I#1WI4Ye4a-lnnbGAemN5{LJIDnA%wys0sv z9jOk72;F*;Cf48_jALVLr6!1Agb#I9?I_L^4o~HZ%q+ywzvaqAn>!dQ@}Xl9LcbU`RG|C{tFo50$+ww{P~Dq z+!a+%;pa_}5rN~F@&v+7z5CToJo!}$$j>o|c^W_P78|K=bvljVfCaM~6DpFUtKAjR zu@0Fs+U=%t>P2QVF>wuyn?_s4&~A+OJMQ(liMrGt((C_D7rA}hLfFeJ^kasz zRm+moe3IRyn_eZc3|NnyoS}aYoY_m{H@+56__!%~7Bo40qgZ+m;dv7aD!8g*8_$C& zpa_!s4#?_x#NP+6Vaf@SdZduy>+hp$y8&Fh{zSAXCY1k0FrhR#qkCgJ30AcO6_7sj z{NP`KRhE`p9Pm3p=h*L;&Le*Fso9>}E_3D{-Kgr}6FoYm-5#vi;Z<4-S0(-U^g0?aXaVg*>aDK4DZeP zXJN~Zq3lulX*#uAIZhz3?pS!PQR+3nY&@rum7S6qBKzFc+;u-Q-QN8E?eRXA|Fe#8 zvY{^QS(7c@YKfXPcTMw7WRXIK^^($6;6fSffOV;Yb76MGbRK=+TvgUaQrUSV^OCKI zVGo#b69-_oXn#HSL}w^_FgEp?#;yeX{D>JTBm|=8sKdf}#XFV7TkR}*Q*64L3(0*^ zgKQIBRoe^Ak$?3vzeVMdZEkZIH4*_{oLub)`36ln@_QX*WbQ4-he`)QZ6VX}NOx#4 zDKnP~9o{1$spp@Ow*iAQ3}Xnjlzj8+3A8m@orgV77(2+^I{VFoljz zO3J^0_tWy*S@7m9y=w{^S=bvzBbQm3FZi?W-*>M2Ku_KxHICv29VU6GR^Kgc| za`YRhD9eX8{f2E)U~`MzaaMK1Z&~Ti&wj|+vLbLOC}eP1QH;NEZe-CvuvPaKh65YD z%hzb?bI7B=Et?RA14dZ9Y>=y=u(gsfg)bD=#V*042Yf0dj7(`O(KuvM;pSqV*v%42|2Jjgk#u}_m)0kVyzE2^cWMr zyJz7OKoUqM@jouAP2M3adHPaGqg^VPqItefAW-YVG)1M;??XLeP1sPS(scCB@>RXW zJRU$dxkmjG->C)M7!5pqVv+V6J_$B8gMUb>D9v>U5)1N$FI{|>`gM!;p;S1s|Cn<6 ze7yDY?j>mzCa3iQd0Uty6!%7}(6?ITbD2y;b-HW86x&|~VieBLcl7LP3<-S?o5&P$ z?c=+1ekAb&#9I?&KrbQ-U`V;nRa0a+cE>(4`;PhuWWd?gX{r)QXN_4zs z%a4)=|HqR54^&NmFL@O=`+ul+9MON(``w)E>i0UQ^B*dQB_vY5XCWIh#~Sgn|M*geq}y!|%Zl=Qbg|mBcf7Gi&FgL;8%vPgz#`mqh}_?Y)dRW2-Wd@ z@#&{5=)$=%f;-oyF15rwzgJ0}*^>!2sAvL>Q6(p6hcq+?VY9H|T#S|NqysoIph=p- z3F@++na^oa-4z?v`J_$0RznVfs%dCiNa~CCA?)xoG3nFb_Nna*EU!#=3D9vdYY(PsvmuFvCu1`?6&>JQ(k|ps8Af+OY7t$YIFp=6+f1w!JzUM#bNrnzp-#tW&}bbK6cwUp1?j7(<$5yyNB2KVHALTqzb z!W%A&58!<9g1CX6uQ&!$(lkeHTK<1nd&l6&8#e8Gl8J3&Voz*MY}@JBHYc`i+crC% z7!%vJGs%e<~dU0vPZx~h-=apHF#(zf^%u^zzZ>2+lS*BwK@Q=#6l z>#v)4cv)b6POrBr%Z>|>%1E_5kp|n%y>XxMmtV1&rzK{eYGjH@nQaXxhqO{l%uVgi z>Mv}TtV}H^LbPdVlWTvvTGIm3);C;JtzOc@oOIB66K#G>gqa+T>g$O5P$MSJ5t6Mu z=_Jic4yH$vwg`ztXoh$Pr<#`Ku}%r#NGmjI0Z`mevU5N)xuI&O5K~fZvwQG@W#vdr z-T9Q8@zZ*8qR-39l3rDeds9&<-Z~*V)nMw76l(Mp`y0^ zs@=B$a)9$kaVpH?+3g%s`f_JwD)o;I;^HI&f#Vwuuyd(p1DLsmc*AN?)R5tp_1lWF zbCgk}Cra?Zw@UQ`Bj`=`j~to;EuZNDLJ^1mtk9nKV~vm)uZ3ga;1+T*RpK*cU2SbpIhu zicUk7bBn0>OwU;2N#6cVB6huMW3J@&Zt;-&@NRkY<7J=yOVv|k9*}Kq@2Ju;5@UGC zB*DaHg~=iK{G|GL$$;cE5_`1L5L0{IC4p*{l|0fbrAA60PVY|UnAu}?_B_m}MQ6O} zF$r?z_e`@W*u+A^;*0ZY=66klil{t?Hs(*NOl%RFf~a4}unU>Cfy+pXw$sBi zfr0DV9WhM+g-q$46EIG&@wx{@s3%zISOxP9yXb#_#e9$Cm|OelR}`u$^rF0J*D_>x zBKfRM%-pWR0t2TLHdMc@d^Xrk32GK!8{;3}gqP7-Ez6SZl+-svMe@s94+sMO8b>PG zAJ%6doF^PsbZ}4xvx@V})V&q0`PVFLQ1ilt#)kFCpemj+(h!kkQPp9nM=gYnR}N6P>$LBPX28mMu4bBSS~NZZ6~6G@j!; zj!+Q^$e=gf8T1Q=`ieXUUoH1%X2LkANFQDSW{MdpZ>5}^Rs-CpU1;SgI!y2&N;zX+ zlQ5;V#*khd{g}#`KCw2PNP4V6bbZ9pPPqE+T#8*?c;;Vakm&e3PNfdE!@ZD_7rkwk z1kUrfa5~_ZLrRYG0Pr*%G9cfyK{RiAdUjT@ibcWY=iWo*K0kq^rKV`+;TwFAy4^!NriovFo>?Ysm3Tj1Dp8~#N&eGBP?0fmRXODz4jigg>h&t*9iCY3aZs& zlfev>OJMi`+O0;xaAV}8DvS`8@~b>o%k3k0Y~{6a6}{_I{bb60_u42~Rz5Yc#vnH= zQp7ERj7MTOGz-cLWZ^mSDE}C7I$_>E^aFkD&=t`i(E(lj<(3`i&37dCA+@CPA9GV2 zZ(txcgz6?A$bZVS(WAFYmrB-V>BTrAz6q}7m$jKdQ>0t?_K!kNF;JUhPD5Ej;WE(H zHqR1>ouPF;MKZ(e7}}q3JiEe_cz;C4?Xjy3T@ts4GH(*qhh``7bt~-{l6j0$KqV%| z+(72tcC~#TR36$Wxg)|Zo{=Vz*!>1SSrs)Tfuj?_(bIdGuVsEWhgE1F7u<{#GqDLg zaI?DLqb49p4)g5_yc6`ANdY9Q?D5r=+O`~*=9_X_JUT+?(hz5CuR`&NXO9B zSHdX{vmiLPqoQTz2*4HIAqPLli0hD1bv66kojJgpStC(=#n^Z-zjzElhx$`X{39nN z6Yj~+G|+2-pYulrkAj8cTnxuElwkyx??n|c$^)5^7n$7&?`k}ltiGat1w)w1H}YMa z=QF_K6B+gmV+v+LB;NHS?FSk($OXUXH>G_rpp@Gs(IhM#VK`Kkm|0LQX(O|sBT4=A zOOR@!LH2R3yy;%5si#8eqG4RBY1Lq%o;jJg`){T_?U-a}rRpX)74@FvILb{;(c(zU zG%Pyv6(JV-ok@~${(+|eQ{e~2B0uWZ_zit{gxoOdV=Qk^dr=V$ zBfvI4K^1}ec%#TY^7xE0er41Z)lUEOxY7>-|0iYfXWPFl;er#aeCg+ej2Pjc9uczt z?~e#cfD7P1x{sCI9lUXi|Un#T7&Uh(2?(c2}yfIUh2Yma+>avcCPjr}(Ix!Z8_rO3C(4!c+OO-MhdOe-%9Tq6Fw?q`Pnb5 z31yRisYg)tHxo*5ll)LTKd-#O@ZESOLBj~WolcuG3=X(|la$Id>9hu5$AwBo|H!wi z+#dsEaDfb|w68X_O2m)4_IYI(U7KQh?+VJQLg2m7CQEV%k*=_G*8{}Xo(`!z%{Rwn zs3?gYrnD$=rI%2Pp~;=3c#AxL_dD3bd|B5pc4mduo=Ui--@%pg-t^V{QETseQ-pf@ zDk^?92M+-hvs+8TB3_hj*O;X_g1T&67LP6Dm2 zB~bnv^9*Kh#VuXm(b3Q(w(;fnUd@fS2SxA#Xu5>sn&LX1DRV0%Z{12Do1Z8I68(bi zsHiq1+*~b0+Mdbms_ljg^<$!UlZ3TQ9# zyuFniIE&16jdArPlldH42kLQ4{BCsTtEZ@?`pWveU9lyj@w(X(Hri!a!yBrR+jO9~ zH8%eK47-t_`1-E%vF66?^7da)b_ym>g#q)RPaRb5`$%XQ*y?ky?`O zaBWVx{#skx7Xb^w3e==7%CPs7d7qJ7(;?VF8AKknSKjjI_mr1v_@VBhNo{EH_@bt% zgzgVbLK3lKpLvy!Z;QU9Ns{32nU)5DZs8K?bYLj#j|S7>6z;>_sM-n7T&a`v3gafX zpO~CBOIUlx!ruF4ov6>pbL|53i(fFpW~LNXV2+~G`<;lljZymCba zkBm;WMgiDy&ZsIZkO~UwQWX0=qW}kq{>UBo`o&eT=mLNE^EPPutMSW`q5jZuC!PWpQ0<_RdURx=p6-a=GLmgznXFHZM7S zDH%6P4hs4gG&aLbR%7Ayxjs&<-8 zuiV3iroe|jGSXECOJ`ni1E^i_2XtnuQXSY~JP-!Z9Vxb=Eu`nFGf|5pwi*0P z%%aa-eI6`;)E8wJpWq_N42dN|@X^%dPz!URY8?ZqfmBx3?kkQM?&0XPWb9OTi7S@s$aUJZlqxKwKn`04VYc^wk4x)hCK;*Il-#+ zf8A0p}~*f*DG#mD?gNRy|3lo!O^3x=}fbPdxUoMxMkH z{$4({{0>U|D-=&_0Fc8UVwj-pHHD&nRnkn?hvbH{o=FO3HjzElT`js=h!-z5+5Ixb zr}vY`XmqcPGqWu;DBqLI8a)K-OUUsgWgSmHVpBo$vj9tc@#hJs0c?0GZBoI8O#$Xb z)Opt(o#t1K0&U=B0?`m-ZKPPy&Ex)+4+5cPzu5B7!Ik~HcR!JrX6=}Fv)QER4kTMj z{jam1!QaOj6b-KuRE1gO8AyK!@rgAFVt}jt0UwJ!kX0H?Nx5?NlX@C50_wYN?wi_6 z>9vr$(r>R42>!;@)%&x^G%4jte?@Ql6=Ux#2v7G+YXC7q)JBv!$FcK| zIZoO)(Gu)la(k(I3UNUAEsu{ik2g4feSl}X{sYUzdtKBfl#hQ-|1RzUxX*#EKIHv~ zC7Z;3k2+maI$qeG4^~g*&>sWqHOT7A)Ry)+u&1Fv7w#(Xeh_z0* zsk()1>~?26rFK@<7Jz~!KN+6OJ-x5*HZc?bcC{Hph?}_Uv%pOI$DlLO{{;u} zFV3MzRYwh11j~mUnikqzpqA3d&s_3WL0w9#!k?AsC)n3Pe}#$#SvC@lHR+v;!r><+ zj~X@YQnBl;pkeN*YcY2((*(u%MwY~chGqB7v_p6PLz(wKms34ov^sagRyd0(2PtbWvmV>3H`Oy#rQe~YjAeJmwaxvNl;hw_yBe;wX=7);h#TF5 zK9$U~?;u5IACu}2hsq0a@E{JfE0{Jfn6J&MZyV~8j4o}c@4V3o;ND1{TWT`)5>ah! z8~_EbXnc*tw4PFBUHsXn-v}OTNpW+)J-~rXeci=`1Q5>wHTx#XwrUnUcqnt*{O4aav;#A=b_cop~k`nN~J7mRYQ|wc`sqrooKnFK+Z;X3dhkNl^JqrU!=E4dG;%Q-X^F5bVgUe zVZMr&`B~1lAU4WVYPlav1jB~u>aN4FU%7xS+9v?4)Jn5VbZB9x9M0RLvjBWES;sfK z)=D$>4X{ER-4TzCEs6VWa{%~Gx#$E!pXC+T?%@Db%kvcWaKu>bAvz=MaV3BFJuFcb zI(j-ayQ$<3I)0{-+k%$EeDyvHuwPHH+uHYTU0C1mos~+%v)E#W93SPBeN#d`l%E1F zsm|?F01s4EG`P_~sj7Pj+vEXqs!+SejKN+E9X4w7$!!8`963B&J3WcCwt#aez9CsO z+@*OM995yD2d{@iRX)K0ix5B|tkqToB_Hq**(=Nw$2}%k1C~{>mh4%D4%#&&1#dPI z-2&sUD4nJ?)u9WP!ukq9(=;@#wS8s$ZIhzPCKOQ{v0Fu$#TH8ONUKGhYBE)88HQyE zJGc<`(PN}P+eC97OS9C%r{=TFYZT^54`1)13*Ue6B)#J^_r#)oDY?9bntenU94C(C zOcYNy%NjB!{o-4sf$beH-o*JUaBf7M>mJv{XK;<^;44QjwDiuerD(e!B)jgndDfAuXj%noMLG& z4}|#!1k$9m0oI|N4}&xy5|A110z$vNpT^L}9y}_KRWqv$GuM6fm9Urnj)0UTp!e@> zKQSZ8XZX+IcKSaC=lnNn8EIP^)BmVtNdM!_f4S@@V2dk)_DreAoSVU-a}0zJT}{AG2Xa0 zvGcGTmG_Q@Xt*NYzIVYEvWW?y+OAg#o_YQOaiSyH(#X{?7)v!_#o78(&B}=Jc#B7O z%n%H7^apD|AfV~pw~4z+CHnFr*gDu&>T4-CkBj@P!(yO?XjIiVXk|3D7`~Td9rY}1 zrmd1kWN^-6v0?bOHMTZ&wOQyHle@n}xs>JmftB_kD@4X?w|M-{+8Q44eAe;c_>(oQwZ~w`l5O-TFl^;f zcBVXdXGWxOzxs_`Z8x9UKR(hEd(8+u`(jt_&meEDRty;Fn)HZj;kA!J1LNQeHSp8? zSZbD!Ad*ATnbo|VSg>&7hY0e< zqKW@Pz5b-9B^=8Mo_W@G>~r_49bSB>Ri;tWRTZtSQk6J`JHHvv144J4EEL0+@IL3- z>;)_jgATbMllNcmp0%R)0e-;`W9f6$P(5F(%y+ z-sVvJ%C*4A4@S2|zCp~;)gII`nqDnDKBorU>@U5}p;PM?``)4V{IzY|=lM$nxVA)j0x77WwmCaFwG z0zdoSV*fbj`fnU}`Tq*Rzq*nC*yHmNXNpFm8j|$$&zJFc77wC^S41;}h9DNr*Vp1s zgR?&}3QkI^mCVUSoTkai!-S%9S}6K;%BQUM$eCu4-w02N$!R*Z@w&SC&h7htKWzDh zN*QZ5`GUI0T8)0;*S_^&sZF|vN{jXatCbWbOGhP5x;1CDMVsVgGqqzj5~$%5RZE^t zS$LTyI+@`@#atT#(j4Twf1HoHJw9@|7 zA63h2ASe0THo3D^1#$$Pyb@dpF|IMruA4!W)5$?`+r$;mJ3<6}Q*o)RipKo9sY{y~ zN3iAM`{#9059?K%`<{!DLAFlGyoP2y;Fa>huj%9GEr72xiaRtIT#NyZ!#;<<|aEEIsOx0f$yEJDl z5f|dAe$W0^ZYcc?_uZ3_1iZkY%%)4!mD5tgL&l2F_n^>Ur^ft62RLu4l<11Yat1Y- zeaH<^x<|fYL9^!YXHf;j8rE#;iFIo?s9h)H}WiYKtBKDdmiq$ z*I!Qq4LP}?Zx!>WQt#1wxKFKJHG{eZzHNXYMr~vd3zR>OpGl|4TNtBteqX(k@!sH3 z=@I_sZz(EqIfAJC&`Cb|TeN@UZ|nc!Zx8oow*KaCx8(N@524NtEKJ2M)@HfsiK-Cr z^$+Owv62v5g|?Ztq|l12PlTGOf&{$6G!){sTF=4T1SuAuL3=tA-W(GCoxjD&min8& zCG#B|;H&RweN6s0{*=99m@`HR1mW5iwh`Zs@T`4@ld|2KbIsMp`J z@;Xfzg_qkJLiHDaOGZ>2P$T}J1PxmenD+e);D)(*w%ftG=4p?WtLEeg#>+w`ghnaC z`zVBodW1=pMciIuF4|G1q)`8nOS5x78RKjp{PFj->uuHxO~FqK1O1Qtc`EJU_)EgP41#GAB_i^*==j|)v5ODBZ_r{z6R54`F67g2?2rXSrTzj5PTucgk z^!|Jv9+6ryQf~+$FuqgH>V z*fpdd?G&3V+Z1YW#~r>Q6utn_9$sM_PCy_YWu7KYB{&4X-*wF~w9`WMc8w{b`4%Xh}RTgkz4X0OeQ1vXb_T{_4k_XZ2eQeazG_np$U?$-lMTS*{iCz+vB)Dg}s zcW~AQecq~(h3TgA@Ha@Ctpg~QH3O_QCv9JTpzArGQ_PyV(MLxBQX3jZusuu*)mNRq zFm>wRw^7JzI%~Lnq!_H9yhNI@IrYuWJFP+LG37EAxh6dOCd8u0m{7P+n3|Ni!3Ac2 zeXwyS{pr=$a@%X;C@p1Q)H>=!0K(mOHiYg7NK7~yGwHZ4lIo?# zqsWb$eE~j71n;>*L&y=l1GguhPDT6#Yy9P3@$h&U^sZikn^d)b+G$l^YebR z??$b+{&ernkx&-pw@3jwP|-_H?a{ZvOesTUWrW-dM|r4g9IE~jF{%iK)I7qpENUbx z_!fBD;l>@9(%KN=dITHx<1*x`5*mj*C0E)&I;|giA5C^n8;4`{i+Oz176|9~+j56n z%;%NDHNTl(Am;++x8O|Yg;N(Kyi24q<`Nxy&$i}?4?AIdF-MoH67NAX1F%L3cOM{s z^0M}F&jL|CZ^F-4yW-6nEQjU5@4`f6S#0`fS@d!Hc5odu0 zG?wr695i@Fs&6ecPGMrf_`adY`3~J5@|_oJouOxa=BWL$!p?u4K4K3q_$tI9+Rkvi zk?YAXa6{VEJI9huBsy1!*$sKZ|JP8eZnR0u<5LCU|1q%nzpTaJLt6%T5f#r)Y2K;7FX=(e$8Wv&->v!Rz+%Q11&zkaI9@^HrnvAZlAZ zK$)dMzEN0UiQrLs_<_P{7%BZ?i7aL{I~iGbgHf@MA$`X~7fU4%bg0%gp=XdaVikAA z!A9vQ+n)g#^w3!8q3ufov~Eyuexm~Kf+LyWDk*{p{`C>j>JJsLGLpSLUL6`C1Ed6T z-?8q;HWGKLRp=vtAX}PXm@6{OuQ=cq?Bfe2ST<~3fint?zepD$G+swb&Z8T-)Yie% zX*?WgH-|N3or(x#?YFB}LIN*<6Pgf*TU=o-{|3Xkt;%TXtdl4?^F^#rAUI+@pAw4% z6H=aAd(A9SjS9v(iZ9AX!)~n+2oD&62H%C7%Oaw5%LK@w!U6S7e9m8P*0P$kXm0n8 zoJ?aSZXEKceqw(w>WIV#JB8HB0Egp+^VZs?=cO9hSL} zJ>720j&wbx;nzx_j^2?t&UO@5O9^JQa=!eK6)H{g9wzgLYyBA!Aa5T=RDaR>?h*W` zX?=v(rZe^KI{M8)VjOOZQM-7{5uCzcRDF>`)K1Ob8YzUKVh3(=j8aNL6%(f*bX#4k zZ-`-~vQ_nc${9Um?+*|CzS6*&T%ZVgL@SZf6{n>2wMm**qDMiU(`gR}cF%-ezKH4a zU+QP(vRv<0y)tzrDN7so<75R%cWj5uACD;HH={QZrv>{sQ)2&88TEJenw#b}35YP_Dn5vreeuGUi2A zF{-CzrtS0>s5;u!8R-0=B|iwJsT8=$Pd{}z*m$|HImRSsFT0sm$BaU{;l*O^sTALr^X23AOfsh8(8hU|bMb!EuBoS$`^ zj}z!~RX2Z9{waW9P)Kaz%*R7diGfd0hb`AmScrDUxKq<2p+64$TeZI8lPC206nc)y zarF8O0ZydA<&*_1jD{KIAeeg|X{+aK$c4D%J-Bl5N zdNVdac0Exk{;UwmDWr#o`(5OC_=GbBuE(z|e8NGO3{7I8Ghm}ZwthE%$7#4`$DMnB zYT(H~Izj3G1t)0p_cfM()jxR|sjmWX-et}uI;W6Nm^?>=eF-5u=6Uk9Zb$SZlVBar z=~U|)dA<_?{Jn%^>pEc9Skai)C0d;)?TZyrpE;QGH$M+KjlJ)z1 z63cEqEej^NMkMJRDhi(cBJ?h4OI@_;71pR87Lp?=b<3P-Dgsa`uo4wV5v9%sGA))q z#sSRzXRe?ZmecQRjw-bnSz7%^xUvW3^)#T1P4j^fvf~iHO<$F(2g&;X5Ka;Ey#2Bj z{RX$fVbLQi)Q>bwhx6^Up-)1~(MgA7Z~5tO(ofoZEn?*}L?ibfLp1&yyYK($0rPJ^ zu7s79u_@p`UHDVgk^3tJs)263SykkRG8j1RET|$fauaypm{`-#x)ovXbQ?AGHCc%c z)*ZQP!qlg4u|H?b+!i2nyly854LTbto9Kj*J7ip3O)hv3*J9Gn4+$^%K(YFHfSJ=( z;wB5T%tcl%tOk3k(!3?G5n7_UOR$=J6=IE@l$zS=ah&U#W2U>43|NQ6lTBp2fbSm_m*kYxD4C11wU zD@MGkQ5fJAp#Z81@Ebtm#nB&z;qD`#Ae;oQe0KtARqq>Bgr(eJD}$=!0fO(Cn*cP| z5QE1LF!TvH8))FxpCs5|Tu5|fn=Mo{JbpozvJZ9Q*DF5&u7-cM^8 zSUIdl`5@ylYAgdroN7-5QEH7Ha(avc&ly!hkiu3>06)&O7(BUKG_mE%xhQrtcK@fx z*L;K`N0w!772J0E5)dlhNF>;h3|Ag1mcY~iH#6;HxUo<(!0#@`v4l!AbFIUSOvF+^;9Q*M*qlt>$&P8?Yyae4Fsb z7z}KamWRh+QvOmFb2jl!e+#>HTeZr&1vY3;K@B*Zjavag#~{4z|1!_}S;JbftD z7OC4h#az6u=N^?|uFJ5uly+AXDbiP^=(q6|n&{4dz28CZRq0t#V6FsSDF=)A3_>0x zPdYQ+=!ap(TJBv?2|f7a7H!q!Y-vXJ%}q^#CF)_z%%5OUIOulIvnDyC&4^e--?Z5M z${vYh&xm(x%30mA`W~6b-e`0PyFT5L;F8zMKZrmP{@Izu&F&y6OJ6%RM%tp?Xluu~ zgYSj|$V}pL=DWJX3!2b+Gz@D95I|OKS1(9By}|qTp62*tYWCtEoylXy#bHb$o zH@bUQ++4@u5s+A0b_PJrD??bu-nPgZg1CQlytsRo58^&xj&2d7n2llg{Rhb+mx&_o zktPkM2piHBcnFo!chcjo7|E*Xx4bZyblz~$7(^MfK6_#%^X>(b7DrfF1)4LX*&xo> z<3G@U8OwQUhH;zE#^62lKW#fH{*OiVGu7t*URzhGT7S+h(R?8KZCt_%3o*1T=&DNn zsO#upK#Qhj1eF9!NptHCkJ7A)M^8*r8kUt`G2bBH{e7B_;tKHYJNU3aSE$1o z)Iqo8a;iL?wxfp;644YP53h{2w<>L|Auibg5%MBYdKp{#jwZ$3A!_a^CXx-HJuDnF z{Dr(=kaY4wp$6 z-e7I(8s?R%7BU{F(Q=xqt31W7p1bQxKJFk8$_t5FSZWaw;^0Gsk_eDEER=2w4SbEanV9Ck4UZsV~CT>Od{dR}acJs26FY=jN zI@1mOS=Bjh*~*`x^{&0tIp5uXqeiU4os80^7wER@GB6F;Okd0l6`@3FPJ~p2Tc-&` zp)MwERKMNuN;HRReefI1s~u%ENg2~ED?o~DHe{|i_?nM9nelukhM92ZIhD|i`nE_$ zH_&tB3n`U*UbNh3A#>2fVZm#EwkN^m_YI&D>horXeH0&9;z>eBCdGbNG-{H?5XFz3 zMG4g&vf%ckMYYe@qlhkj&m;OlOs_r6f;3(VKoJGI-04EHj3y<)=Iou0p%4$BuXFf` z!rdG~iA>6fdZ7dRC_DZhxvhr`cmi1g5zQ9h{5c!(U<|n;94cDJ3vj>%`pIznYi9Eb zH)7`g2FVTjqOjKcO4R$<7~gz{+~^=E7b)r!qDvq<5Z<%ZBoz54Fm4*l9e015Hz-rDyvwoTEkbxvOttiEA<$Qhav#^{>gb6!(kOHSX89!MPp~uh2^%M?egkSLF_! z7gHFx7tRnCUqZ(e*(L0=1eH4Cr=s))`%fU%!#Kd)0L+$P3{h5zwAJM0?MMPM0ONV3 zxrMovTNpxa+dKGQSDi z^Ea$n2*`2s3%EsBS*>W6QEcXHNToL7aiLTZ4U4f%iWao_w8qy)54~>T`kaAGYb-$3 zH+Xf8RREOHIm93m6-vjN^+J%+zHMfQ*eJMiD-p& zcyg`w#WOKDSDN@q^MZZb{)>&Vx5NFHaQ|%csCMb&%j>aDkq4#grW6)6`!=7R0lI>9 zR$k;jxzCWNtjXTTH{{ku8ddp24<#ghGadFnFj2$C9xB&AFnvgA1___#c+4Fv*)^JJ zbh?%UCLdLxsI==kqQ5u8rJXMW%i3vUEY*i#$ac^ZbkPyl_@aY3Fj&_FMEq4)y`u2p z8ArAHKd+o7ptGFr=jRw$rzSphD_qe54=f9_Y$Rt6qCi~sC{1GlHH2kfI{MG0N+4&$ zPqBV~U%%-Xj3c3f*O)IX*_;U~oa4;PSi@dYf61XHn59fDUfL&L7gd8Zr!_gRURH0m za$PQDa~yP_x5z(xU2ksmNddgVJ7WNwP>E(*IggWSJ1u{}GcB3OuDL7Qmdo`y1R2^l zuoE4W7K#0m_IBp-Nu+sYHgd9YJuS}jgqK3sBgC(y=hr9QNK!)#2kc@UMsNJuZpE{o zLi6CCLfdS6@|7ym3p134voDt!e%FY0QyhZfO*8GaOV*uD&4j(1AKEj^bp{3D{3-r| zpkO|WRlu6s+6wuQ>SE}Y(tQID5drY0(@#2j&c@gPg7>b@fDuQ2`5k*zr-)U8&(IK4 zr@4a|`4RL5NI>qx{S#giym?Q+g4dXk>1Tx7Cge)4%GiPDH-TWiJU+i0s6Gm)sQfB~ zyopycxDQRh5UpYg-#qY3B{cm?+k_zo;)=Jp2O_+xm-S(sAqyTao5^;!CtsS1}_n5%WKYvm$tPrPI|^A{qac_7L(jis+SR>hr@ zjA?)cQ<8jqxXD;?x#e#G=@^>6)aoJ`4d#HZaL)2!?o4Cg&%6sY)Ui+$#M2iyaxy=t zCc_&a&eYhZIQ@_5R1{{iL{u9)F)D+xx@%nxC8e}LXVSd*=`JQVZlfxp=qPFw(*BjU zkPNVvz=t-p9Z4>eQYu*QS$|hMmjgr`LCq4TN()IICh8KbwvbxqXEV|#sEWfK;s?G=%_-~(D*th6#beQoE!17qz(J1PMO8`S2M(x>21kJz9Wa>1ZfWE&cE zg^+CNV{E$b+c1LnXW`R5iWLS4^(ms{CMUsx_kmIe)~GJJaDorTVElb*tt8odOYGY( zu&X&~GE{xMZ)#@!yy3-I7Se)W0dqGOl5V&a%K|@+sG=N%KJ0R;IblIa^1@_V+*0gb zMfx|Vt8f82(KPlMny`R{Ogh17@Uq%;w%b`)lxll-iGB>hQ|+xntNMpX{S<4Au7`Sn zsc6JU1r)C_biMI!WWh@10 zEf4ngXl2Y?qHPm@Un;@d{E_$*`q>-0v((X@5ve1n8jiCTWF9uNoJ=E8TbLBAVl0IP z7Zs%m{J>XSdQd|$=2;eTN?R+OyS%SD1j@OqAzJoY@MBj9ge%uBjH{#e%XlhtfgmY? zYZ%D1P!ckTW6-QN*L71Ne0QD-K_G%fnUZAnfdzvoI0;d?nX+6XkPD4td9Kjdw3$~c z>5@sAN%g6JRI>iKBAy|@2lwmn>SXbqA@^4do(ERkG$~N_*(Re#4k))H44_ezZV0rp z(j)g&S@onl!t|s+ShgR_nJQAPGhhckjw=ij{=$N|Jt91-5>2$zFyxSDGp zlSO>k(Xo1q=vJJ>lSeJLG750F@t`AYZkoRcEbf3ZeqkU|2p|1UcEW>t-oU&)WzE+K zSr6%I7z)hFi?q{L;h2iXxZOh0VZ@XY!7L^W*%{P?o1%ICZbS%oY$Rghq)O0y^Zom@11j@Mea7i6Pcapjw z2Dv%pV^tKH**Ew(SbC;vnsM#7WATw=r*7r$#elDZ43;Ax8o0wfiYL)l~cH4wj0TTLC$D-w1BD zKzPO#V$iw2;bwv_W6w#MFF-@L!RE6WI1%p;gikSEVIIAh?Jb5~GT z?xp(0>=^2Lff2UEI%7L<8B)HbnmmqRjZ$2vVrE=(XmxO;H#Ir696_*gktZ=O2v4_9 zD|c=KiSQom#@zguTT>!PCWEp2hN{6Yk_phV2TTJmqLEG8tyg11r`OE6xn2>eow;IoD^C-HlR8W74h;uiO!{ftUx*OMfzXfP~nZ$g`>AJ`JQP3>t3L|Z)=nT=j;@a#L| zsS;G4weGyS>|v94*qFTp(Z@i5N9T4QL}wq_acL&OxxQV6FZA=3H(jXHqeL?)F)N>4N}oR@eK8VnBwB|!UESW`or zy{jnmLLu?zMx%pyyUy;==bxGR6xKY`fsS0n;8yr95?P5On3@*IWYQ3c+ime)gW5&W zOX8Z%qk63Y$tCc_U6T)|Fu9xF%XtTuK1GaX#u=eQf2E534$!Iias;A09Z;GVQkzaN z#P7aot0#oj^^+CVXe1q4(3t12d5*{tKW1kfl_Nk$$&F&$C|WRyBTtO3k`H&RPqP2e z3a$}8ehZAbgz*VSRmRY^(Popg^EC-W6gyqm3Wmh^C}SvTX5|E1S>%@%MO>&bjV$o< z1$-Lq0hK&1O1J_HH?CCKb(3_1KTPaw4iUBZ3i|qy3gqz^8t?O4t&%H^y0;y)ZpGkR z4!)qnFtJNgS+V>kmGKzf1S?uoC^2~*c6-ny=Y)jR>;ZO?!>g==Wav&0>c^wgx^TjK ztnwrK`B|d*IRMxZ^qRC>eoVAJJ^sGI2Nhm^N!lB8YW^WdJVA3HS}k}S>K`~=;3I9{ z#MY}@7S;T&#%FxB5jwI@AR)Kpl6jSeGk9cmwy1Za^T!id~;oP{h}=}?Xm z{A*!=Yem7Dg`X>E54Gy~E%;-F3k6U|X)l4fN^op;jPln7N(RuZ6 zMz`*X_b_{O7=HYR(As^ZKj`!0Cx7HOv}TgmMw8cN7sFIGQc;wXzk&N2@0_M(^<3*> zzYliAZ+*02%=+Gb2(SU@PfeYZp5&Dxq_EuRz619=b%((=BXK6bs<^?%+-PP;UMEUU5G#DE%OZH00KkT`01dIHauIV z4?7ZAt&q`Hd)@(??3>S>yK}end=FqhnFm4rZs8`NMIrI&(xZnV13Z|LrsLDMOQUUY zE=0#8E&Ec*9ok77V#Kl?7)@Qmj>pR4J_1&8IeqHnD>5 zgWdi=#v_KPU-k83H-746OGA)e;tyuqdQ zF3FyLX>wa)aV=DWc>`r0u7(Mu7%rY`gt1~3()ZX-?_H5-z-m&=`XS>&JUkOl1|1HUZqAFPTB6OEb5XrhqY6f2?KV3?fkz)7m(fn9&z79~PdpmRD0Pe*_) zuY~5=-8*YYQJ_zhr7SL`zpRjifG&-xpeD9D;bwzm#upp`Ba1B0)B>(5$AT_=M^pA* z25Kr7>+e4YPECsK$BKFdCV<7Z;P%}o<7k&L0u)nLxrdE8jcE?z_+>IH}Rvx36c41_jY>h)LyKMy*~w;EcDb^OqBo7J#N z>Wybqo{i3)&g#pJlO>%mWxr5_EYM`fbn{Vlpp_97T^nCu^Naqmn;6>6Q#m--=fp%1 zxh!xoP;l(SU5XQYtnnK`bha$9XxZg3ovz&YNVI3dGKqUZIQ^k~b7`izs;a5vJl`5W zrP0~y2)gRB7`>&$TI_O;_Z6n{Yzco(8wBSJggGmeJ=RM|*|L^0*Z6`7C*QoJukP;M zXTm}r_hnv~cr0;-m_hG>r!Uar4w6KZ)_O)+!vKa&-ha)nGb##{Vk`=S+p(;O6{7%! ziCK$WDp4hhz@%|)zd6ui6^4x&`YuhiCB4w41ft*lj4EfQr<{@JV3L~uyFd-1mYq4P zU?kpW6T_C_u(8suicxN4v33d7ec4DeaP_zS+Rd|;rk-F#)NfOmdia_o|5}Mk%_`h> z;F30$+cRub#-C843nAvxbHSZ5vWSw({rK{{2Px0{hTPiynesg5qWv%~Gj2`AJ_J9_ z@`gSprSyHc*>e#zu66-tDIZe6Q|!-C^^x;x#)-hy zLfXP(m99+&I&3b-evxlN(ykE2-|}&wb8mi{F41_G_7d=a7c_+*vukSH{AmNL&Cr&e zSf8Bc4azPZ)|+q^BlgOd*6gHZGK1t-QUTpekZcLtz8&SJM2E38QF)(tAuea>ss*{p zs5HPiXOF^aJGg3L2f8r{SGekq-%hyb4ysMR&U6HnUON)vwIPij@74}{nb~eTG2z#Z zVSnQAXz4xEp~cP{^HL)Gk-k=I7-ul;*5?C-hX?`Ht+@e*Fr=Hx|i| zyRvRI_s8u={;na1xN7if%M`+%Y0>@6xpaErGZI1aApuoe-IT}1#Cn?^bTF6;9-Ui6 zd$DqBlxv{yZ7pJmUFwj^?lt2xQ$Y^gJTlMsDwjay0kB`h;sNeiGuXq_-*vQq_`BOq z?9GfWVIjVngKrbp+DH;PdtJCiR$1@F6yTHhlS$O3`)Av7%wyzDc*1kBaf zw_1$N;TUZL{A7y~x-{r?DGE_y{vkOFdjg-6;jC6E;^RY7ii#VPXP7$2+A;cQ)R0s9 zYntN#J?4P2iweLUBqzU5LZ8^B)-rvw# z!!!fF*LmQ+_q!TA6k@&RK|xEFjB!iM)p zhGC4kzSb{SozZ zTpZLshw_t`dP>{}Ow)kbGCI=~$Ac^0oeuBdkp^`tHVM%q`pE1&|UE@%5klrsSV=*{_Q})WhUQJ)K2{4Qv z-{&GgdD>Hs4!Gaka8>96PIen52G-RbRlDHL_bE#{xEO->@UMSXiUl!GSSt!vjvzN91^(w>(rPH;Fb-9ErOanu~S!5vY{wMU9pk>>kIzQk;?_m- zFBo)+Y{Qbn?cjiMv7MrPXEAL5SkzQpWe!ZyJpc#lI*^Io&KP)(0sx7+ zS7nCTfr{T8Z>Je}zNPOzx$srnrq_-8@+F=5Fa+=Ud9QkNd=++cG)nMZ?QsMD8P9Y{ z0ZnjC!G+UefNOj74of|(8@inh9oaD(q}2eam_|L!x|92yYIQI3%=WnlN{2Uyu`_cZ zeL02Q*QiU8mh|x5-*Z#_O)o#-uqzSkC=hJUxl9eoJQFNghu$dWrkGKc$`C5p?M3$- z@VKvFs)tN>X3}34;wZ+AmYI4gtl#CoYe?HG@_5C z_9q(bMY^9%ygyJ9-dRu&H@k&iOko#?Uz`y&0#E-177_yQ7MC)lPml zD2BeH)$YymB$VBKH|~UteCCNZw=wQzb@E~8p~(V!sos8yionG5z!h#Ts6=SvLUKkdi=KTL4Qx>#HPKNDR4vKuc} zxsd&<9b*BtSqCZvax~T7`xrF|1yDiD(h6iDI5y4@>3*qE$H0M$D`V(Hf zSDg9%F+a+!8Kzkr`NX!K$?b5R>1n-LbK%MJ{6q+{(7j8L@>Itp(u}!_*%~Qfghw5IWAHZcmDCKEbw(%HZ4{Hpt8;ZPXuKvT&lV4bqvFnP>t(GF?N#dZZzg!G zXjdx&ZT5JiRQh6!HX$<{w$0!37^Bd-zilE<(k zWMSNaY6hB&g&LXB2n@5LX^csqv_p1g@e*OLO{UAp~n`n3_c1g32jpgMbc^xlxE zgB_>W5U;OPzo zPOt~mVS*~hd+p&8Rc2V+vjBjQa)>6g@N0K&u#GNTU_Hcc{Yf1Yl!Z{-lO?Bdcj|=j zdXa)5E<^?)4TDqqlJOBg{R5?m{IuG zU#FUfAJP&E&rAwW0=&L35Q~hV5RRdB6i_fp8t_EFe>nYjcQ`VT0Wr*>2Hj7Lzu99kPH#15H%gsk>?OltWraB!7+(U@`%_X<=1rk@W4L!9+oL0gFdz zYJIvt!x!v900U_5lJfN9{ly~6>pN+~DAW~AUaF!XQ|508TllxUX=2q^6e{&gP^iC4 zH`Tze6Cfo`-jt=Wob&Y=*>&^zKGU^M8MAd0<3rRe)x|mqfvN#8PN{|413-~f!4T)& zNYU8xN01b2;}orO+clcV0sIz*$~)!vl3v!zP%t-2cbpRPwUYW9>%`>8@apQMB^Bz6 zChm*txrots(S@aPRX0;g}9CqH@r} z2QORmlx9HB(t7tqaGcNn5U^O7cUhfw7ElgRw3Y_8=%0n!#)eD=8k9-6b<5#MSq80d zzZ5HB3O~VR$y$h*KSJD3&q-6*y$+q4h5Upa4(kt!2NX1_;iW?PgView{S4nn8{k#C zctIw|o~ktRh;}{~I0bHLsoICjSFlW2Yk0c;x$i(@l8Wako#(RpP~51?_Wbr9ZXmDU zSDs~SRTB<5+L}52^21#_hmU+ViLt5^wKpzU4q9#&qWK_DO5cTMP{j`9nm8vxmAHsB z^Bs7LAfWlgNnv1CR5_@xr70l}=Ws%oqDqgK3Ugw+!52H(Rs&H%W}$wqv|iBaiEyk+ zUQCST1^Irl*hqm|MMfwwAy&m+mcvYSI%&yu$2uwkfzqw2_|+n}q#Oy#26>T_u5B+GLmkKKF-sywPv83LJa{GHNG zb&*=4C$=FxC6w8)?8Q4-x5bMOB3|qof{!;)PPGY_X@yusxGcExuoOgAne(-|Wx9t| z%7^c4#Oyk-_w_aSoO-mhw(RmKt@P%2`w|`MbeOY=9HIBE$Di)?+Qa*&evM>6J-Cm_ z<$+)Lat7^}-ou`WMzba*l3L%AI`T`#MC6^WclL!I2qLm~;>jS9(uTfX^gEyO555I1 zj*B#bMU;h*6hEk~$32y-y&v-&cN{Ig-b=A4&$!vu4S*bd&OCfr;-}UVr^8d;TJ)GN zKi+3!ao@u?hVp$u_zdvG4K)@z>Kb@QlIaz$JvvFdp4xjWG&iYu&fBkH_*Sn?Eu0i0 zY9g%{*rhs(`y%yf1@d(7rl_9ArF^MJv;d=aJUHG^GRMMI=;tqP+n9D;@x|tgmLI;23O1u z8+W3)xHA}A)ZPgMx6@B(F~mf6NmG_I%n|UFm{=kyjKZaIZK|n@Z4sPfXHh!WJh+{L z*UY-OEga>N*d%bxW!aYb?YG)YZw1G50zG6a4%=Sc9M7muhLK5H$EMlZqqstcYIgvS zr!yri*4aiVP_wzer5jQ-9zFOGR=3jI`%nqZYPl3_CT~f zh#3=ajvRByZsw-Bb8GTMcaFIS)@GUQWcPk5wLX~X&SDQlD#X5qK0EiCU6lw8US_Oittm+w7uyeB84Ro8M73$j6@# zUQG6=J-DO&l%oQoc0%#VBSWA@jurqZietIG=e%N?g@f9!m$HeKaKBrxIPs_3mb?`) zBQzvzUeiULR3`^>@^P0)}Hx2qf%EsRi}-y50?F_L!+jcy`C&- ztNtDiR;8b&+kbN)P!f#k$i9pD0x18*=0VxS{eOf${p;d`05Av%XnH?@O!Zc_Q$V+PKBD|h$=xpZcGh*(xdbk|+ogoBVnAaI z$qIRe7r30NUJg5JTF-ZN6F^JhYwmql9dM7b!-8>F^ zLd0lX2jjM#K|0N{r18$Z#@B^Na49cAQ_iH)TSTw9n5ft^lU0(I$){0={{4eplbl|i z$1Zf`Nu_|oj~E0y6zl4z{tmd%X7Bl!H+dg5_D14McMK{i`CSfMP(w$`Ao0SU`oQ8W zOsgi@c)aqNa$226c~SQ_>ATUbt#dezDtQT8dRGa{!~5_%hKE)kSPy-Z2$SOfuDE=MqsL+S>kIR zJvv2CtqxQEp{|9%n^4G8w^sz~NWst^u9uoC4W&Y}q1(IX+x9rc4bE$0Yxf@jRkZfg z*9^4Z67?BXxVmazCGpBrfvGVVA$_JohjDd07_jpxhe$Mirg7o$JU?L6JQJsidmZ2$ zxDVTV0I<(7#;cCbWwGBX(?~_BnWze2SO$np}lIy>JKa zcuyTKh5@2{omQ2&Vw**3TtpN!e#{x^#4}0OIO2|4nY_i&6n$%F-{NqQilfg3(iS0f z-@%es+Hk>@C*mD)25c&-w+DJ*T0(u#dd)&;{JtUiU>0@QQt@TT+@i8FoK3mGR}4B- z{TUR`{NANzO4*Yv_-ob%qkXHmKz_rssC1sZ7Z`A3Yq;>H+;zD7hWl<(K{t>3PIzrt z%m@UV)N`+Bk^y_ zJ*OS8XNBG0fyatS{SuDsV;)|99w7D+*~lIdGJ>DW!OixIqIz&1VG=i=xdUuPUzk=tg!CTZeU2)uk@3;(DM1E-pSDebo zA7wv^20k^Tze3QpWe*PZJ!LZ(ylWkwh8$&>Jimz~$qbc5kuFALp3GxOEmjl!FlMMj`ZnqDuXiSmFf=~weJp&AHyKt}!ZRWC; ziJEJYJEw)qA1DafB7#?_+3iSlUK7i3bSWcBQ(R(GE_Rm?U6hI{`fgQK3lgkU(HPoE zDj;=<|3IUhYUyE2UWPS1FZ+YLNNLcjLdx=4?zl)F-L|UO)FSw4-{`0#49kG3n<|$0 z$H4j4vo~}oYWG46em<Wb?(;lGPy0#hnukdPgI z5;2h+|JS*w%&v@sweRq9F2WsO!#MP!hd*ri;ce$tCsrBArY&nG=r_dvZ-(rRT#E=Y>0!8MlxVurNtjC>o`Fb9})%HZBys zw5=NO5zFRt{mP(reC~3C@VHY#1{Wo32tf;dS@UoN+6SmogWwmQpAzhKYUbcfZ>y9S z@C%VJBdIOkFq{N#03tAA5Sm(<^h@8FlT}wQusHE!O~o(|Rl%{K1#Te^mYi8kp9IInX1mG6fCiYOC2} zo_7$w<}@HL+-FLY#*d&b{plDYkCoNO!-ed{PMsm+m3e)a2)l_~L(th?NBA)%YO`@m z-Lr%GNY>=Ff=cS;Z1U7^lyC!cqGwmZB+x3!d7CC{|2&O|Na)O&JA>qleaw;!r=bag zb7ap82!qzjQx7L%vD)911(Q4(+>rhueV+0VuA*Sp%K)lO z7i0is7Bo;UT{n)sDZ8tpt?HRIAqGTBU^?)d;aBrW9Y6bq5TrS|Xk_Yj4@`_3=tLJ_x5Uzyse-^!w~N#-#^KDI5(Xl}xpmWUP|frMA4} zb=^fNShJl18g4m9G&yBVnx!PE6q-ULY3lK>+$72J$C(BLU4vnK?}2%a6hdy&`nIjO zu}zUnRw)GV&*5k2YqW~@-$5QgcH1%`p%myg!MW%T;UfpykFcioJ%mnhXjehmt+7M`!Vav+i7~5?d}b)hZ}@GR?cxWzf4Gs0_=wgj@?dROk}OGo$Np$EKDTk=AYU@ zdc-E-wA>~8pM6#Bv~UAwgzGItEki#*3lHD8)gR93_X!57+h>R-PDIy#W=_?RtiIve zIq}sK&E5P4YgyP=&1}KJRX+>#ngV9tiq*+qp6ExLQwg2whj)nNf=*YdH%0#im1{RV ze-v}!&U`1>wYRz%g9FZSDPw93i%yDs4ukvqogUIqE!6bc+kNrY56OQ%Zf$SwPj@AH zDbx_=fO_vh%u^iO;8KF_Joj^pgr#uvTk?H5vfOT+!J8r9<6>#2BblY1hqetqZ}OEw0p`p|?k&OoLO`bFqT&7$fpBR+X(Q;^+KOH;hJ> z++OWlol~Q|!G0@Ewu@R4DZPhGD>%b7sFp5wx#yQ0EQSo^?z178&Er>vNU?qu?0)78 z98-PhJy2<7Xlf&o0hJ$DI~k!B0Z$Aj`YNzBOw?bgjpG1T(77MKdQgIxxZf*;TAQ&b z3e5tuUXJ9N@`sjcr)$~y+gR51pH0(N8QB**=Zl4Hj?inMqlCY%4+MNHzE&WzLpTWQ z7~L%?6-%m+Ab~FQ655NN(BefT_UHZIeiCSv{Wdn7AbaK^e+x>Dw;V-59XJuxiAXt! z@6^zm_PG>I-lZJ~>8=`%zZPC>dSAY?COffP)(Mj(ohfw8_#nr$Wr$L&SZtF5Q_6Rz zPRJk*S?w)};cSLp7nUh4{1kGud`PKUAkmM6?d4^I!NV}ummGn;l+5jbKFUd6x8bT? znDkeakik!G!(-<{%)tB^HJ<(_OWQ=e7*i{eyiygWIc z5?O+Fj54`LjMYj06K3UJ-~@gR+4GHyCGYt_FTU^)zNIHw$x@(~mM25|9E`E8o{{IX zffABlfZq-FrjBEclH$ork2uF7tKbQ!cp%Se!%0}MaAIphxs;oBFZ!-t7j$#1$X+BP zvoNluPokcy64e*>SLGr@R_W1{4)Q1PUvk5yxq|fjTW$pZk@EQegWSlw{O{yO1^zRJ zZpFPpUdVj4h+pzAxsk~TP2rTWnh(z4lr3B1ry}rl^$C~Lz$^7CH}(bM3vhEE{~=By zf={p+_pA`k(NQ8v6Bo_^*Kx#pH^s)}W%~HU=lcrMOL%z@H?T%3jqFq_&!`|e)XRZ% zWN&qHMw|XyZV+6JOI3*wIFM8K`Ur8LsArM6MAZXQ7bLIHU`Ge?wyIk)A^4*i0nux;oZ~Y z{PNQZXNy6uK7G78$JwdUjI_y5M+1qDIGR6aoVCeB-nhsga|_}e$PB0hH-WIt+N|YAc8Wb%icGWh*9fLE>wP-aPN_SScO-6^Z=FCaiaYgz6&nzN+-=*16v-OaT~9D z9f3ofV%9Bs0x7VXlUsulCX95mk6?5Hz1p2>;1oioHC1e_8oEoI?eStFX2a|7%&0F5 z8j{aDs(xdCBl}BLx=X3&I=@wg=pR+(-%pDF?+*9>?LGh1Q2ncKO8I-kGV-;zwpt@0 zEoG;zNnXP4y5@ofSxnJri^x_YVR_1mm>kEcE4N2+R<{DRjm8Uv=l{2Y*u?P*igV-N z0CC?8iwR_nNFYo^7H#5@?U687eXbwKQqSV$g0;riWi*f zKjCI<&u+O64QYTLYTpCj(o6V^1Cy0=hYl%G?ALN`yMoF!&=Z1eS%VBJx&1-s48$S- zCHX5nTM^2R0lUIYyf?d-dbwDsvrt5;-;J9i3VG8s&7y+DL5y96!PeQ_GZYy;Qi!L$5khaflYgmWDn_VtbJoW;F5`r@9Pozp?t z)ZLE2!1!C>D@N+1qffGC9Q&g}mYRKf=P6`?`CLy%e7HOAdZkK*nC>+0_E=8LC)V zS@N++l*=b)#j}czcZX4(o`cX##pGd2VRroFy-=Mw-10m!pc8bwcVZj|)!qj88vhS= z`Cb8S{bzei1Zti`V=JO7>8;Vr0>c1VO(#oIatls{=84}WKGjZY?0^HsKX3ME1b_O> zo=MYTf2lCjXdAaaCvmOzlZ3uNuo4K>S5?luD#MWj&d5X$VHe(afw^eFqDR<{J#@rDElv4k* zOjGb7cN5B9Q_nU-eeN!5`-)D z)?f~;5HX^wD!u;QGo`yW{5DkB6`|1M%XNy_>BALBJZ7-XP5l~9okM`8v^YKMm9lCm zS^9zfXyWLet(qKrl;<{+iShB|4(esDGZwtVf?etgw~}30>In7wKO*KQ-Ri@3zGcSl zA7$p>hvok-WJcJ;)WX)p_+Qi|J4QhE2LrT7&)P{aEQkX*YAu1GT6tzcfuuM-DvtoE zgMuWf5($RTnUGO@eUR|zxLVhz0Z)9=M?$KQSp%7}I&*ZYYd)XM{)4?Y zCEG<2z|?1to{FDN##tx zD-GWbDn@_H`M<1ewdyw!PzCvGqqA88O*1m@8Gr&|0l1xep8&8}22Xh*tVs1o*}AoD zf)-n5+Q#pbo?SA$!rarSX?`eY`}e~rzofmk4k@kOZRY&Ml?|sEo+Gy$j;GI$nLR#$ ztbs0MSo~CB=+fV3QJ_ZfW)8F>k$0H1=B@1EL9I#sCfX7L174OMDnhygETKsgTrNAb zznVaT6dFUUl>cZe+*JH#DWt@1AX=-jUI~>#3`NXDWU-JMnqV?lX+l&fD9KTL&9aG< z?c0qZ!VVpym0z*eDxk1VeQUKGuvQ6~L!OE_MrTq~{|&K#9Fqu3Feba3QUAgllzB2Y zg4V*@+z(F`2R|Sm&kmJ?sB?%C$xbwsGFFYU8E=WhXk;s-xDSSA)exviAcL1;P~&Ho z6H*W*tjQ7@_LUl)kpRtK;=246ANNsqY+pUW5PH`IHbAew7En6r23#t9#N_o*x9@mY z>0$d#BfEiT{In5kR~}X_KX8#|AX1SDa|>bU9`D(K7PIqcrph!F;Y>K?HCU?#*qr09 z{(kOYY%`0z>L$`7$SBe>*DcDLGioar^t{#`Q>cH@UO1PfEIFX#9i#Wx#-v`?hhjlD zye;x$k~&KpYOb*N+ZWCl7eiH>b{woE-3H*?I_8>liaIC`M8#;VE9Xp|i0=^}=pL-q zw(78-A*g$QX1#iJTfVAOn;&gC+} zwWOcOv-KQ-o5xJFU+f{b?n!pYE{xbPR6TM=>g~&U@Hmy)*{IZL!xjIbpRq6R>12$0 zDiIIMytZM&o<{EA;^A}6+>ut>&!M6@sljMA)96H;z4NXX6iYNwr~xh0c)v^CfoB2Vp;!lL%}Px1A9q1)d5{NGu=nB zxg)a^Fd^r??P zcWa&}wB5OfbI=s0`}cFY(Vq3(@Hw*|R9hic=DiWTCPRNdo_mVKlw@gMLd)<3)f$XN zIUJ&DC$OHqpWTVhh{j_s}JXQUzZ_&K{%7Qvp zBR8BOPtACb6rD(*IUt{ZSLneu6s?iI`EB6;$ZzBQzo?4+s}8BZ=wXeZe8Ga#B(Me# zxJKj5v!?JN5H{Ds490{*fm%<*6GYR~%B~s5qpF)VB@`zkWij(C5S{pN*(?;LdKFbi z!-Td6Ux3cv|okzD_sAmcQ1( zYrEkf_3g&^c)tMw(Nn%A0c0`N@U$IVy!GIro8`=sK7DyFi=VM{b<~}qc&_K47(8dl zUXI#V5Mon;>?X{MI&BCoE(PxVIkq#l9Nz2WAk{*|1l7!|Bwmb4D9UMdYOztzvNo#j zNR%#d65p7UGv|a*K2e8;VjdHnm~#`)a7&?8Ys149Z(<9GKs2AFD{a}-gsp%$4B}&~ z+i)0O1Y8=rS2~OcG#7SuGvKAm1m%tV6xM#GxQ`KEvx!@(gh@v~P{e9fUpn7ESk>!J z?yJi6OGFxyAfeVNlm+dgX2jHsJ8^N6g2t?tVku{2exCEHxjCoTap^J zayC7{Op!K6lp&S?C=k9^FFmPu1bBUOUxBjU_n!7^z% z$r&;yQB}%0I|tE-B2l|KWpA?i=)?>YW2ln#g7D@OtW#um?OZu$)due;2O>MDd+P$} zdXAs{ljlkn8PvvG;>js#2PrOwx)X?f71~$&CRHK~z*5yBa86ix9f{sRGuEzF$re>z zX@NDkj^!@RlM%i48#xeJzj!;@$Z|e@uc5Tk6qCu&l$Nef+*rk|esp!MQ(D<+ZY*wK z!O6YvyTq=ybp`1c%z_!!2Yq+7=q7HV+j34@!TF^w+#ZarF=uEt9VU=vNi0c?2Wdi zWG^xFbVGzfw>JW`fs$Gnk-H6o!Z#!Wk_xh^VAfyJ8YqII=Fu7|0y07QS|c}NdWkrTsiMQ+dZ2DW6I%fg?!G2wEnyuQJ_HR41WVwsV1E zCYg#7vFIdO)KMlzx>YCt{T7+)@$ zD}$Z#fqvP3?`eN2!LXkZ4cN2NMj5##Ue3Os#6_*G^atRZ|l!PZ-jz2 zy=lg4mT5w!Riz`ad=n!m>H)}UQ4qCMKum(Oy`{?b31`mg>ke|zTUL!i?$4TuJ4^mL zxrvSll=qc5uqo)0Y{q~!+0wuKbx)A#}grYVPe_AGx~tjm39x7w^J131lEH*kvXSeAX5-cmMGeSTjCDE z194t0Ymj|P#~m2SJ&w?$)N2`*M1TrUNR@4P0hvf|FsJtHzS+>Me}9m~nZ2lnMe!w? zG}6`?uFW;Wl=YT&X%uAF^aylxG@G%Ny?S$8?3EQT;`!pz5yMR3DV9m zr_kW7j(mF|lm1w1a%xI=Q6}7wLr6Z!;z>Utwmj*UD_iS<->lTMyO(F+IwGY-u3oFP zi=kGL;8K=q3zfpQMUm3dUdNY+YCCQ9s;xBjkb=(UUdMT^bE%16OwP&NrQxs|Fi*7x zkS1I&wW*FIf=+ZV;}<49OJT6%Jz?gbfS-YQo-bQNQmwMphoqk|db3YX&N4lZub+QU zl`C~2sKtJF%D4VwG}^yERsP?tiMWBSv9*bWt*f1p!T;g_zF1XD4NC?26BYs*n&RM( zWo3BrZ0H~(O`|G|yb_}1Dlj~KvwJ?-m^dgY*@<@C;@39ZaR={Bo|T2A3r(tB%|WbV z+l+KDu`=`n!Ptt|bjwrAuSCATL$}$kS-#1lI5cW5_gPxx$}EM-3=avk*q7)gJ3OPQ zQ0=PoQh(tzTFKKqCC`)ZHbFq52+7_yT&*NgF>@?ir@dUJ8XnkB|F{JY!UKJZ5MyvS2wjvh=)kyl{ANrt2+so|FMt=MD8@9| zZTV*@x)k{oVBkWnF;737fP4x&va`CMoZXN57AXKyw{-N(JXGFjiyqoE0ZWSNXLa$j zBVqQsW{g=vk@UoO2RLmr1;7OS+9E8G7-x{Cwc64<;j7M4bjzr#B}d0Cep|9Py56$> z@xv9#)0h?;t-^{FjLFh`=_#GzEQ=NRK)P8PY%U^Kx(RqNSp$Lec0~k!KY{kJI~*r` zz9qZJfN5*ur{01zFqcQMp(;jB)9u<$%J79EkCDazYgRo9*UHue79Z;h=|pM^Z9I2F zH5bIjw3cXyI6ZV2S!^m-@L6kq0oDR^>RPx+pG;_jm*VvUg~2zpk=~wN;*tyLB33k*lBwfM@Cl~n}VVM4n7fKicvZnw$k5|Rv5W6>yOwI zdJq!S&H-;Q9KzKQ&U*1BABnm^V2Qfp^|}&Msi68G4~hge1N3a7imd}C{YJuld2Zna z35CrvtU^aD7$cWOXr)acGWA6G<%1zeCA5#2$fSK~nSQi+$}?}Y2zzpZGuw4tgp2VR zrX40;1^OUSg?)KlHah8Q2EOMBi`k`pUrYD>Di-Z3NOP)QN`XtEmsXN@FczjWNlW38 z1vJ|U$P1m8cx%a+(OiN4=If>*K#5GE1WTEZR zG0Y42GIhO2%IaFeXk94j0Pwz~3k6XTL&~IGKUSlZOxhvzB=^7)7y;-5*|lvBrEaA8 z#`#I=7HEp4WFxB@`=|t3CAo+J(?}?V#|HBWG=KQ^1BN)9vYJ#Ks$X=N^SvRaKVaCk z3-AN)b1A<;V@O2$wGyYjVev9fcrqrM=_VVVN5 zbY9^d>FNjMhbGaP>TVN-_P_r^_hx29e8$M-9yxrX;Wk9?r@r{Z5i2(MWIt+zo4d<& zODC7R2PLRWwvLL6lrnajIDAtD+y&k!e$V9$3RmEl$7By*-iMDn+>*neRnSv7P}uw? zT@eVDllbena8&)yS-)Q56d^W2=EN%;I@!{Fo=@|hr~&tF6yT9(K6_D)(vu?F%pUba zhetWZAdBdQMZ0&1ibvQE-457G{-OVBQ0eu8a8Kty!kR3s2oEa1jS}BK8l`_f^5nmZ zYUcNR5!OSRu6$R4UxtbG}V~voJHv5sZeiF)I5~( zow;pgS}-QYNrU@Mc7B(3p4J<3ovuE%bliTZhxR~Lv9WL=Vl_6Ylg6V*9ghJDNm-Uu zuX>IbVn+j763&iBYRBOD1IZsf@#;+C6PNAi!U=>Lx`O6gV5{RjY(g#4X<02xlKL8hn zSS$(+I%_qVngykLIC--NKog}iq5>hk=ia(NRHRKt%yt?JDU3E3np%C<0qqvp%JLL> z#&S?qyh>XS$4d$y96*)RaY2EWfU(9*vUdgRmD?hF%(?e@foMv1=N19I%g0E^)Uwg; zh+m!QGb!z-*}!Dsw2%k= z9$K?d8YdGGPK=ev%gyJ-FO%3&U3`#3B7d?;$P(>*k|LAQ477OKezNI=(UyfIRcwtx z@uTK7;VKFW>?Ni0q&upSB}9)Uxd@44Hh$Xd=}c87sP{mJ$+6hDNt4axjWGZzALADD z>iPt;dp6yyZ#RV6$}5B%BHKk_hIn+k+jR(3-o_3fRo{d|a+X{kGvQ1{{UQu36%<}H zd%ca@pQJ2RUJ5`8Azog~|HqIcL^XtdNTe6ZSsS!iKr|Cn-i;IJz(OS~GPbrw;qn-NoJP~}kF`7O?hCQh zYFiJul=?^m7_*yXT{8MQ}&>7+xy-Eoa7xHx^vA}$6n0tvU1o3QJxqANtL2)K&sQ5Jy^KHlA(tXu!l-fHD{CPnwEZr>wjW$VEIn82I=%tDjd?FYOmeS2tu06- z@}o9B-gIM#RLL9@WGO+YvBOO1JCy@7ph*ODcF_pfq!ZSTd<3XdVU-AX3G_JUuzx$( z8qqvsHrZ}ii?SBouJ|YEbfN5TX>@G<&1qVitEQ@q1DJFAY9&C>cii=BK?u}OPE&*X2-woS`A8J2T6Xs8*+>k{e4Y`c5DIUm4#BND-_`Qz?R zX1ND@%$fBD!1hd!%DvwmM4SX8neLOQhI_#I$WzA>%xI{616g_NG+yHvxY{mWQ(7|V%8i0Ik0FuIJ1>cr6 zet#wn1(sA?0}0G$5b2^ZK~LgKWdXC7Pl(yq3@Y5^{C%lrAFe`KUJvOZG*?#i!Fu`l z&7P1&-FrUi@SPlbQV+i?F+JqB1w|>NFxAHo+gHzp)K*qzGF_NxnTEQW=}+}>@X2sg zH-h4$Js+^e2TyRn##tj~))Du~8u{$zG# zW(v(8)^^Y4L|~6+90RTH&Rbjg$QDe@=oC&X7c`lF>=ticf0K{_QC#eG502&Ji~N)7Oy>;7g=cP zCi>?=#&XhL*M<5_l#VK0+bsU>Ha@EEe7Jy$v80-e1p{8#dNjl!(xOCrOYw_;k-4dn zD9?ND#Y-{WSv&D}(&v;J{UJ7OUJNb(ukzT>WclPQwQRal6>x6ZR$v%yCsUVes^M+A znyMrwdILCz%4^5nob6LwUld=ou(QxvWM2P?eyPw|>>4~lEB0dyK`-`W96>SmV=TcV zoFeL>#P?h}xu0P2w77%TH}Hqyh2RlJ>iD>aiEjwpA{nx&Oa~Tr_>~V|vg8@aT z#jwN=*WVv{&-fL=@N!7G>7;s+I6dpV(41y|U!m;3Q99q`Y9_lcBaBn%4G=in)vVeB z@NDdG&G80K0Y&HJnE`8oyiIsR41q-Fv3Q;ZZ6X{44T$TuJ-rk@BsUG9ZH+UYqDmP?@8;B`Se=AB$OCr$v4*21`SnrjO#cYSkD%oHPW>74HprJ2`88O$tH(}} zGvKtlC5TWOtoJTPjr`@ZYsl556b9hSKjXEcRe3G+4sJ59*QQS3jLw%*CwNTOnyUCR zWcZHEXH;c9$nc(p&AlA)b`ABOpl$g689|k+9xnNw5!b&!O}fIqC1i=g#}<5M8?@B$ z>yo~+_^p57*$Bt4g%c{HCFZ4fh8}l0QG}(V?9c#vDqmAa`HVj1K>mWZ!UwuyK*S|V zz@@!x8hgB9W-QX|SxG(QhO4}dTEiB70fI!fy{b4X7J82^8R~T)hCJ5RNg%?W5UM#g z5T{W8h+MoFckNJDJtFblu6XRjd4O7v18m$$VdzS`WW_@|8(%l@4lQ-T{O(#Y7JHVi zx8M-pGR-y8`xXaVkj5?71!y=@>0MP`70+)RHRDXvO&{x5|A`qJt0+x?wJz!(I@fk9__cgXO*eVu4e=p&)bP~8;!A!C)HW` ztSZZl!07}Ph9E(k%BE_+bgj&K*~O^2duyL?5tO+{w^8Wt2=(MW%GG)3Zn-Ec%nL>% zSD{zePtBI^zF16^TnPz9oF?wUTimC`%a(guUB076%9OH99e33!&BI?s&d zys9c&GV{CD?hOVPs~HFx&D4z+wPhL@gPi5=41c!StC*XXNu@r42$@~^u#sRqt=1dI zKGLd)A($Tc4ltevL8k^vZST!{{5Rg-DZJ8fTNAAcDz49a^%}9r>|l?@mZZ;uAQ}lIjv&1=?NNpWm^3-t@rd>wOWY-_oD|d=@=V9g1!$ab{7MZG;0*W5`>uU zk20MqQVD;xJa$s-)T5i%!lIIN5X!!1W>3aDL!J*fQpNwXhpmmRSr6;0YCb^OmI%Kd zd`FOd<%|N*6^!)@yyyB;eNSq1x(n&<)dn$+)4h&QJn$7B_A0MjLMTK@$4+PP2Yhcg znFNOI2>?;Te*6?V_u(h@G;)>O(C5WULCF`M3WtLs-$r#t-hhpSWBz+anddBK^b}`1 z@@V*RIz*!10LdYPGNtt}!E^FWIe?{D>@Of|8EwPODOL8USA3qEKQSU^o*B|6(=OGM z*}d9YYplOU?mGwRII>o8VWSO@Kwxq(F!!m5Xn zXZa+yf9b4?$&(iPU>a$lK(X0q+RT0n34QW7*MsIfz(=&OM~TJBA#d*-ei*!h6^f_G zm1YVt zjGc`Q<47QN%E}&Rqwt`4cel+jcaN$mpEnVC`|W!yp7JpohSmDlz>$(Bi&g80L- zMt6S>9qKO<`l$V6uj)}73j4$?mq&B}@PPe*6rcMuyI5Ghh|z+1-GJ^{Cymrwfb^zq z>=A}3w_wjQOp*a_$YA8J{af{-Q&pvs}Vmm;hl7(o=kYUO8Mj1Iq^Xd{oi*YRZj=gf5i?||9g_trrY|(oG}A5bb0t1rqO|{vH(4a z8Z0C#Y>e2?M%&@W_RYjbirYE})o2M|li-+#d4*=ay&I9);S~Slmh<$)dENH59~ibc z>lYj#twcWEu?lk~X*3HysaVis$W!SY1~m}@2xRuNvAgQJ-ow`%ZY}d3blhUB z&9(>8l{7NTXXC9^jrK#$^5(H5OCjQ&Fb(*jJnNLw7$cb!>z@lEnfcjjsG!!A_NF<9 z@>$L9)rJ>ySoNGRD$3n0_Iwq$8oqfR{=@Rz%$kKt$oGD985doNxbQVxyYS`t5+htT zSTh_<9dTh%qC@tLK4%1iV-x612=D11MA1QH4^ZsQdprbFtG$5odJ!y&f;8=V+6N5f zjVjO`Wo5gn9YRH$5m zUeWp1R!+r}-$l2GOuS=}C+tQgp-toZ5U0g?tqoy~EHU56hYT`d;5+U_d5}rqdtCVX zTTCARW2U2Bt}Gb*)L`m<`*&~B|9dd*zXziIr(j%*#^#UD9mdBddA&&q!(i%KDy`KF zMEwa=cxG}?V5;Gl_2P;Y?M-qz-Og1L4$kPC&0l>uk_JA`L!Udznjey7u}rZa@%FJt zTY4lgn#3^7Ous_~Gpk_OG#JpWl=bO9JvEy{Njyf? zqkSq2C8Eq&%z0+Te^jTyN_!V2Yk(CLn`Tr2TAB(2S^g$yb8+RRC~CZGvri3v|~Sg%{A-r`S~fu5c)> zRc1I^n(QWC<-9J9H434zI9R+rf;VedU}eC!s~aMfj1PFtujQ&bKPb{voWEXub0oZCxxXn59&tFSpH*U{ zHD#MNWo#CSNu0Ed^lOt8K#DpiRfTLTq|ry|I(EB#azA>DiX+4{v@(Dm1r=iI5wlnw zV;HRjEv!Z8GFAR;D@F{xOfNiLvHSSL#h7p`APvc4|Uov^k#}fbh=<*$AV9{)CFYrA+9^=U$$_5rDdB{5o*@i^_2boLZ~}q zc^WfL`P7*0pFA%VRA|JNu-n?9nj$`m%`GbrUm20|9iP$Co+bUTs#Q1)&;&gu!Z-cdrDQT8b$rO|&K-cr-Wopz??w6no#0{-J*`;sczRvqe z7Bs)aJ`TX2G!lg7TB=`otHgdd!CdcO$+X-kZIeSta)h%g}?%v}j-4^hI;y|%>19^wC?A-FhKVuAk z-(`~{fIbNGRjU2D1~*DlS%o-g5Y||tG^FQ8F!q{^UD}Hpa()`#codHOWxvY z-rxp@eQvIuf*CYfL@2n}-MxR|^A{S7NzzolWESzH){kMz=%I;wx11lx|Tl@K430wjVP|^ zl;7p6i`$UBntM!LF}B;dBwk05f_v-YEs1J=G4o4R@x;yt9*YXJCwd14#|_t69;J2!B>Tvx;X}IV=fc zarx`TzyDEPi+2*)Z2eiG{F&ln4LgQoM?G1q*NKLN7Du?4L*MbE#f!bHiAkJ?l4XL? zM5oi>LJdc~^?>e5;Y@}RNTZN-B`N`}oQ0FX?;3;*z z&rr~HzCV`GV>5Q+Hj-ZnxeXm+=e0Va0V#;AfV^fC^@u%mnteMf26=XAIXg3rJa3HA z<&4rZnWBsa%b~;WO8-ns&(9+Az?QN>L>j6p0rT58;H`(UhzMRtocuX}m5wq>4k)6K zSU;Sm>{TYy3r6WX(?OYu#Wd|9eMuPHq>Mjh1R&F5!pF;_VHwNXKYy(wD_UGKt%~Nw zzFg%6z#$ufkD1QvLG&crM{Yi8{ju$(M5qrLg^d}LAS(k<6XhP;{le6aA7m0vUzbF z@ttEI}W z@)lZw!LTkK4TxvYV+u?nE59YXuqi7ll4pki$h3(n zWR-H|lf!&j8-sIyk5DFVpM zk}9fvK?#7E(8jQ%ci9_OB>kYY`2*R~sK1Fl1X@yB*E0Br58IUd>jm7F>4RxiIwjt@t&IZN2oK?SY$8T@}h6xj}`jX3x?kSY|-GpKM?Vo8II(dWU zQKthK-3iQ6;wLhmltm-QsOe@A_2Q~zHPV%HRXPfpZ3IxT(}SVocOJ4BZ3=Cps#Z61 z%8oo+z`N}zsN?7}H>fn^KfCSZy=mc~huA44Z)dum=OI1fO~k0g!#9s|*eVARRe){k zRuxb3SEA%o0kLI!4)9jDtL4H4dVV>*Aj(c(*p#{&hhS=4q9HQE?0!qyaH0x)oE07=*&)=7hlE z_9bWZ2`LZBqba2Bxlgy2v%c#8Djyqn}-@0bUMQe zNbzfo%@a7gQrlf(>8yK1<2F zky4=sUiA>ac995C7FCG&xNmV%`4sCXnvKdgow~&@&X(39>N6i7U9#k3yMB4xq+xHe z&BHR1K>FYAB6a(}uua`{9rKy*t6m&5bo#i?r$mLLN3z!y64b0nb>$YUs%PG87nVJNM`0luvlX5B zj044}f!ilZdyq>AOi{Z;?0HO_MLF0c61voAWVNMo(7&cI2(g?EQw1Gx*Wb)%P7IuI zQ9gF(S8^7Wfsggz<;LGi8zIbCe;nV+ZbjE>;pjE#>iG=h&{J7qJxJ9w7oa9t)ClhQ zL#$8letRz2io(5(|H2mv4lYGVk$3Ro=&`|YkAVa6RUvpY*Z}~=8TFN6v!6LYLuwZV z(Bk9*1tiuVPurSNWeHiUUBz&1aC&#dwC4~0NyXOt0;9|f1*e58yc9+0#GW3sP^6>)0;f9oOP)8K^iw9}_m^)LoBsGIK8ivf{^)%ZfXpAk z9?kGh)8eAkXFQ>CZU{R!dOorNs3*nbeyn-v!h0&zAwxzJMr|NeHwXbY-lZm9WV1J^ zCSFLembn*v2mx`FqmPmom!aV^JtAL`LE_wf2|apOe-g#EGufdanOKT0Udbe;qS3V3 zdvTwLrS?*^bb8V`a^WXjsA3~%xGoPcNKB-@<(7T;+{CJFBQB_`jYzg9KXv<#8QzpU zGB+a3`qzfU-lhh-v19vwq-#->Gs?f=^fYKiM0;hs@Ejm>_R8OaY^irGc_vGK3f3Q} zetsDyf58;HG(*Fu+!b;96B)5m4Y0s&l@N(L!rnNaYQBVQ!7vh6(%F>>UK3NQWkd4? zN*_@D4dE`C-a`t92|L6eJGTDvOYks}G!eak9FOuMwRjU)9Em1!@#{npr0qZaVLmk8 zd^RRCHvzIFcJ;^qZBS}}`3M)`zeyL?)g-F&*4Cq<&;2f%hdKCL)_;Dlw{Vx+ndo})e1mM>6SY5Sc^m5M+KSYGNl^R#fD{S-33zqwy-Se7jNTpgaT2LjeI=}jD zzwvHA-{l$jf!7lmutj5M63C<5FeE6Jz$)jCo@h(3*(@GviQ17j(J*ArvcgP8$6C1Y zWZ|+NHcETu``Wxjn^{mQ^6Z*Q;c)X`3ApW<8m?#Axp^Ro*MJ1| znBt{z2OBk3I%wu|YAP<^&M7@xIWCQ!vkkH_G~+Z*ClL(4DywarDS}Ry#FmwDxT(Ol|P;ja)33d`b%vwyTKD3X?P~Ad5VHl&idggCJ2y8CN zq@EQ3t;LFP+{|gUTll0Y#%MAa2Uwu;JK2mvJ~zpN->f>woVBjp+=&u&#EQh7olldG~cQ5TV1Q? zZGvOIR|^Kdk)|y2(RW^ZTm@A8i)&aN%b*8<1A0%4$5&tYuZy_MYIOFf`+=1tFsEGl zHlI0I;SQ&;D#zI-EAcm#zh{0#{i>jzaGWpA9Cj!Eo*w{@_bIJDEnd6wzq5Ep1$1KVSL?;mI_fvmICP=dyay$ig5V!7`T2;1F zrH`_xE66&jAsKD3EYdZn(qdals9xLi0@7aV+ierMyGM0;k!3=8zG*}@4qFdB*5Z+1h&8PO$eUEb#KC!}d7P1MMkuVsRN{=i#n4>{Q%w{G z?Gd_DHVo(Ug{CZ*6cT2zc^1Ix@rPNnBe}9@0WHOF?7W@p9uVEt+!Te;-10E7s@OrR z!&F$Ngl&|nIc58cek>tcx+ojvHcM3<+4_dJhG+V(uZfLR_nH@@8HT!{GV3phpr6f%{U-wG>r`j{gG-~G*NVrn z^u{A$PsMqZul_@te+j3&GtOy^=UR)!@OD*TDD6Ova+G5%C$zv2Mx-?~IlIDKzkUR; zPHV*|f0VRSk}qeGU%Ds^?mgOqY&Df z65~`@>=W(ZYIVuM;*J}g2mJ2a^NuZI(^2ce(cOlRC3*~sf7SJ$)VU+uRY(>ilXE}>-KJwFr2U+DTFmW#DjU3FXf6ItqG>bG@%U;J60 zH;Q-yC9|Dlib5458bBx11JL0L8%P3L?)BUYA^pV{C=^Xf!Nk!pHZWG59!10nA2bxKLltVm-Xf2CEEkP^* zJP+l5>#l1@EAV3sW5api{!$ifxtYB(BCm_T1aGs23Y>y#l~@bKU+xq}wdCU@^tOq0 zUmce?{@oeSWo&1Uu-TUJv$qGJ{3%ef8b#Js~l#d#wwUq7v8|KgV0mchZ*Jr9^Bf@L;cO|Z=n}_OWs_8V;HGM9eA%Cv(Wi!x-|=?ljb>JEYsvYPHtX~Qjh%bxvC)s@5VGeX{7IZH%VX=TexwDS z4ogeUsmhc|g)$j=GAr@fTsDau;~rx!Ww$suSQLCN8%|}Y9VgYMns(1ZGE8!rjIYFd z=EVXDlbK0gpGFUSso3%aQHZi!TsB#DCO%8whodqkYz9bO&8C|5NNBJn1b#|5nb~d7 zi^(jFS9*~@p^;TQ9T!;8Gxn906jq2u!&^x1HbCI59M>oeC6Z}d-D}dP;FoytK`9X8 z$VZF+aCEyX&19WS%QM?UErzfy6}zRb!;fXjy7$;}8`&Ep_&E#u=_oJqG5>w|Fl)9+ zd_I90`LtS3M^uih+i0b6GJ#aKTNAI=v z`z%Ro6jy=|AwsifOIr2Jixj{Wx1BMy1$~7fR#V&vAmI}z(kJNcc zNZgQg)2_F)S+75!J*Tz*7Aj`5#8m4uvr$m$8FU(@$Ij1gZcg_6`1#dc<#9RZjInBS zQLkZDufsE&Q>HHA&uN>$K#NCnVfdaK%d$?9s4u#+&^Q(xz;k3*-%5|BF$tj(TSRw| z*gC?`KW8(dlL~DsR=UXm&(~GWn}8 z2=&Cj-dVkiWJ4DTPWwJmB?uD5A*y&{vp1F_G@KdEPeb|;A2eX0BGGofD{lvQ;=s{j z-V{Vq&{s+ASz_evbcWPC_nVLl`i-$~G#z?~xjQAy(ShpshE?zPzNlHdvMgj*jdA+# z>z7yhR3x>~=$bZrRC2`7eM5nn-q_ZuI7F{zeP_pA?Uv8v4CSG-0~Ax^TV3>|#O0=M zd#QV;RE>vE+3H_3?7x<+I&mdKY)Yr*woGL~IDSJ4WKD!YW3mlb{2ziJzlCZtI% zy73G)n@$NtO;e%oFQTcTMJq|C=+-`)^kpLS8r$X>k2tU$WaRP4CZnMw%yUetAu z5R5*M@8L(iSrW8Lp#7|>j_W2(*&noMzcSUuOHwfEgxYG2N$C=7yX9Mq9(L)`F!q$( zPrsVZaS?4d|9JAe!SyYC4BWK)UYw^A@rTeEHA@j?jHw$9UE^{a>ch6HA5V8vvD@~V zLZsmychgYq1HV%3Vgr#`5*xE zkHXy6VeXii!-gQA?1Xwnc)j>xULdYe5*2sDseVDZ2H{#L_sd>y2lU^%s@+O*$0njn z6u=1dJVR&!>B__8p86a#UP-|~ws#iLZ5$Itj2mlQaW4*4_JnhbI@;?}Ow7^_u=4dY z(LYv#=2rmK_03Q*)d)XH;ktME7NRiB3x%t>uqe2v07%23?{zP^0TB(@WtRB(40q5wN+H5xFPL+Im?#K_(vpeAE=9AWP z5Q*drv;CVB#`$U51C&Qq;~MgqAZQTp0Db|~8($g9<);n|H@HuQ^Ef62)06dhV$JN2 zPOI-ZUo=ZNhP%JnrnKJ@hPX0js)>WmtruESjJ#b5v`-*XQ3{N8oQ{JwdT3zz%YrNL zl6`6w(zl(BXs*t$>u(-5sfM(?xeAIy_`vQTyj}U}UI%cedDHP8O$xTlk`6Z}ZIle17 zu`jD13HlUKolb76*dAsq549|JOj(vwDaGnU!U~2#9&)pyq{4v1$}%)kM;0ogS-cA{ zRMmEwbU`}8*sKzGnV%SLB&aZR;RfJ&_}-brsGND)Gu2!^j*~~JHN$|KZ>)h_upVna zwwXLO40BZwtEcF}1o92ZBYx3<_Fo+SV5-P3`$cf!K|p2U59tq7>$g`X^Eto!!1_mT zhfKa7Gyc>+KK$DOQ1Jh308}w`adrAv^WhS;bsaPfTRZcxB#S+Knwr8W~$( zaF&+$;&)8B*7A8_1OQ45t-%|-K%rp7uK6{2HIab6aSiyek9p<7*b71q1j!zdR6LH? zk|DJbfAGHcJS|H?MBE@1j(XNnO60%}o^%dxN;DgL9OVxxHuN8?-&rKcvt*)~At?8X zZbqL5m@P+AnPpPidB3F+Gw6^T*3YU$siMMG@Ora)GUk>R>UwlK9HRGBuR+k@d*Ujx zwi@evAv}+-k4a2gmJbHIfR?nXm9p|upX4p>!rK%+?-Dx`+LZ7SW=riT*wD zARMphOdCdooNkZU%aeL~)Z<&0hi5GFz>-H$$PvyOzO&e*PNi|u)ffXIY+Wng$J`LB z{_h6j*xmN%$(4Q(g3?ruHSV9Ezx8?Y3fw29jjq!del&rG>ESAK+L{xYoeyQL=tc8T z{?IZ}0`f~z=@%(il1CU?dWeROQ6Toc{4ucZY`nBS+TttBHIKF-Yc1ol{C}WsUnOt2jZ|5bd1i?0I#eHDsokOhxfDo6oBU-2|<=Ttn35%qQl5n7;JU zjX)yef3reA7hJsu)#U87jF}0A!JAy!#u`unEj-Sm=48_3JXEdy28Id0P zwyF;+#a_|a6oVi~qKzhBNsaWR64jW`u{pYxl0e~PccD3k>|Qq=d~pkoXu)#8l2bpk zs_X{F`v&B^+3HwTQD!aTAJj-QrFmlJ<_LFkA(voTUfs2mImR@*{p5GcdRQ4Wc#HLk zZQ-h!t}CqfnDWZ^ej6CUJ3h4rDzQ(@ zj{QkMNxhQn&>cK6iXBWU)w^q?Zo*_7UfqiXfjf5fEzJf5vl>EmaFLi;wYS|ljN9C+tq6PquGQVzEg92LHU`r?2y zOnu9RkO5IjL*7CuYwn1UIr2g;q4)bW;+8+|@!{t)!;+@g20OEE*rj%<)Y$y&9NHU> z@1qe4w{qwx9-hOFWCvv)!}zmJpnR8H^;kNYt)Tue!t%2LM9@d?D?+aBtIrSUHmsXN z@NQqMO5~nB1W=iHHNo{0%msKD1$!c?o#LR ze^&U_jXtB|jBQN+>8D8k&zqi{y^)EfojLhG?)#!f&Mu$d|EU{rBA2jt5^=ILF*p4u zBJi&_LG?`yJaP07dDKR7E!d!%LiOe$+{Av;H_Am02|-)HgC$Jp}3 zp*FDGx>82)d$`f)Ud#!F2uW7JK?p{W6RL)T8t^;9@^?9w<5H@N%5sM~S}=gDsRjg~ z0|UCrXk7=u;4_|-6ismh@|AZy;Atz-p$L|#rRy#P`Wie9=&i1y zi(f)Db4}~5qY%<$RC&)sog?xXj>pJL+CX#ekT|s%q6n}GlUQfehgBGA^*_!-1r!r4 zW?jz6_|2bMQ!HZ|Fmp+AGZJe7P}{dHOJ;u>>%+AFSp{=HFav^W0{+-K#r@zL87EIQ z+AUtg@iIZ;1{4xX znu;eozh7#T?>j;9G?5Ujryu#r6J!QiPy21{#Qr*Gubh)_Te;===I~>f=H9x!q$t1= zL7adsogyNRzhvASam~CXmV3h5Lw0zb`b_h8A;6Tty}q!Za8GZB`{Df~cz`({-->Ia z23Pj5vp(G9{gI2kd$|6d>1_5|0656FJBd75F2d@03num~WM?CpJvL-g%GMRjLuz_b zWkV>41N9X#*qukTVgpA=4Sx-%WD`?$zIc$?mAn?n`h9bE()uX?B;!5-4|6%~wPEkE z>p1ls=7fS}G?Cm9hs*1w0n`Iz>0vgz3?@BNxR3m}(6YC5EK$*L5iPv zhfke+3mJL*B*P>7Dw4p~pM^KjkZTeuqFu;2b1Lk45@*v?EF|85O|_c%NqZZ!E139; znP4evuZzBYT=Q7dK@h=hgKm?&-QAFXcXVj#yF}Ze*I@E zrohnXu+S%d<@0YP?6&{^lsg4`MTh^X#{H9?KF>(cpz|A6>MKf%72H@*K)HB6dbB(& zAG&n3;{3&zsP#>=E{fY7e^jXf3wFL&s=ri2yz4>41JqV+qduFwN4eb2=A{O`zEALm z@Ngv5*f65Q<&lgSKaHAqd+CQn(|?=5ks94%r`aK?%2jxb%p~ef)s?2PMbQ$niKT|L zouE4-GG#t|3r=mZ1)0(7SA@fgy116nvv%($+~BlDr8?jwo0^wQ7#`YyPC^M3(JKdc zW9?GMQmJ9q_i|5GdixwAMVKN~gxkFsW^mo*_3Opfn8iv^1u^*jI5c$uGA!jcEiRYO z#<@mkrr=z*Lu`Zi6J%Ckb#+8Hroc>6pt#@P?u|%nrgOg>HXFxj%5Zr`(w{( zig?w=K=dN+;hm+~eIEY7LkbdG^YVn$`BGaiHu%jW=4r}hi`F*F#HE7n4kPEfQ&bgZ z5`@a8+?J@_mW{ByR84dY;P>(O7e3M|*&#T=Z!piC;-lUh9xVg5O}Z^UXpXVT9kO({ zQvN}v*l+X4@bYFc+~aezSsc}!&<2VY^%fek^9bvm8LHqSv;9ENvQymM3K}#rH^Q;- zWFgVA?#@p3V&=*ESz;Xa``rkDHMS~C6-iJtJtJFl&K4G+|HHia^M4-@4Hqo1(GOGJ z@S=^Pt+uMHpaLZE*gbFYUpW0vyXg*^3288J0IP6>6;GAcc3B&RWWF0R2KPRMfwL-e z{xt-^1xU+@nAx*6ST7!w^r%sCFdi>c^?AI_5adqB&}#mLF5#BH{oaOG$XsIA41bPY zlve3&=_THKj;mf3iFc-EqFpm-@wcMzE;#Mb~|8z_vSQajuCzcip2W`@UUZTva&KE9@*vjCDc zCwbwvFn+gYFC>w9WeLQYm>lf=56jRKP8eqRPZw79&o%mgjyeCA({uhgiToGGlYf0x zRpb@HSde|eM`(kH{m69@pnBSGCd3DjrG*fYuQo5*886*9H;wn}Jg=diilX(nuxEoK zi1_8o?s%?D^2E>IjABCMW_Ue!kXjdWEUXr~z8B zna{nGIq3fL?H{;9mtUTq@aIlJ;PZ_C^Yi^bR5AR!^ZnPu{2$U(j?o#H6&c}3(r`#w z5xi6|nNRudXhyrrP}dpT7q{a!t?JK=Y!XG>VgBM7f4Gd#GSJ8m(+B zp#ttmGs7d4bO*@#;cd~~%t>2QvT);$3mI`SQq?X|fiQ&g(TI@IMrw8?EIM8!!=Xi67|go)UV_nH`j{G zc-V`4T4qOM%FB(yb$=#}>vSa+2I_FsEIX2w!u<&BS7J?`s<#lk9*Va06z#7c^wSB< zBjJLTfTRshJTxnxu=ZTvrK`p}q6Xgbt`y(^8 z=Vr$!!{Z0Ez6;SC(7_v7DMPa1R7wn28Dc(jF$5G`R_YZRasXH0e=*BN^S%nV!!Lq9 zmKOMPQw77LV0#A$OObzq&WL3C9~P|uW_5;K>IreTA7P2kZLH|(6PuOBgq44FZrg zFe;|81v5>K!Vihl&|+D-OIiuIa^lGLmbHELF?0>sQ3q1#1-E95J%u(lcmN3GIy-@4xB6-lN2~O3vP06dPZ@SFS)Z#>6Or9jiuIPl#okg+>l_ z!-ZZOBcsN_6LQ8=+7-H@GRDmk@N^hk;Esf>#_$i$ z9CN=o5#wu^&g-WSVuM#sN@IZJs;o9@Gj4z4K2&H%t{+6I;%A+Yt8&sE#i{?KP1|Q4 zRVZ4a?i4Nk-Eh+{+YTn#_3TfcM(4&KkMBgv3WZ57mA8fiVF1JDJ@-pvoNTwn;6?x}TD-p^Ox@W{6%L>nzr zW#i-(u)>K+Xf}0;NXRUE4(QqM>!HkwL1aL$=1BA@xBX&2-f)ufx-QvAuGrrm;`PG^ zI%3!x#p(7)%H^CWB3A4=;*K`0p!*c>f;$K*>=f^FOLOM&DM|t}g>j|LTV=3R5JJ$D zYact<<+Br|i(}*cSgd8o>Ra05ze|U_ztplthiqyHTNMc}rx!)$*ZiVLU@bC^p@d8} zg~c9_)KL8z0+cO#d}ICB$e-1`J~+6SoWwSj-CB!|MSvzUHMgkNyM( z=dC9<+{?^=8=2~jg{x*?ffgY`C+aK!dlqXu<5g3 z3En<2djU4sLvmMQlHmUaZ>}sPbU;Sxr?Wk7dnP9A2gXi9-9QskWDWlw`soqmFompE z;?8*BSjfy5A!^xXPnD5qAA1&7R&pS-gI+2V(_>IjTyssDYi)T4q3w0O+wpD@?cDuN z)e`-SIV-npo|>Gd1_LPT!5z~Ws|0(j0 zP}~2Z9NmC@^vMB{0ZEJHMdLBMDxh@KLU7Lc@#J)8}o3FR(U+1nHex=tMzHncRygmp%@iC zzbt%6E9UWtudck<=%Eb%yKsScz%o%{Hi-d0PvO>P^iL+QlGPX z#9!UK7S||GA7)iL48>{=oyXWrh0YO2aSwW+MWV2OE(Cd!M#{*>5sH(#rC?=BRV>jn z1G4r=>IODmjT7iP5}pp#DrO^h@DJA+tnB*j$MoH!%q?xV*o}dX ztjuX7O`~ri&`nJ$qfb2Cw6!{Vrc!E^RU8UCs)Ux=tv8sl2h4#@9I=n)6mxW!BjH9Z z&#c-ZGR#0uj=zM!y)kGY4-x^PYo73^)Q~Wjvjgs{#<`s9#QtL)x6JJZc7;|s3;x;y zfG*{zQfk!$kLs>`kM!ip(9bgh^b%EK4D93O#_u=XJw=>nOCCmz2aVWG)7aQtin6Fp!L$Ud(J-(8eN^{s;i=LOY`@+`1iX9= zEmchpuif?TbgSsg3>Jk~3iS6RscflvMp~kq!DCD!%ph3Z96*lvu zkP=bcNW?Yt;{2_IKc&=b`NA%5DAPthS?VG>mtMLJlMMkhH`y%1puvS}*>)^-JExgi zj1?4r)bT8C!3^$J=@{4U>d}e*oW{6hs7JxnD=M2R*|3p=jLn_Wc4NSu8xkjhuQ+ES(CH zC2duH#K>7ywZMOIwmOTM3&wH?iy3KP+v?4?q3zxRK6#$!9|)Aj02H2T5}0 z_P~_DTmg-duI!nvC%2+ba4Ez{2 zT>76T1j=>c0DdZ$$tuPhz&?h?K7r(upV#{+n!$16aFt4prXf5h6r1+a#tswpD>!Aq1|vEHzDa%O z8vMNdn1Xu>)HNvtgNXPtO&QDNvFx~E1KN$>YP_-B5NqEKak zC_lw0^Eo6dI9+1C^_-$2GrEkoM3EJ4ZmP^_6?_}(t6?2iFZ!@I7r`L%6mtlx1feJo zfO%@j5%wxG=PsEI4HDSX^YdZLAdc>edn>^>k-hj{>h@sx3di8HZQ$*^3vX2tuJkMBb{*XSvB`~~* zUFsNPXX8uP0B;UO%MaM=NzWo^`LM;Vraj?^%GXE$$&Gfie#Y-a@*8MjAYxpw0z(CW z@(g+vI;~cnjCC%D&fRJ#?v{PX%l3o)wg7NC5iH$Hv>BGdo5c*ng!E@HcVp^8^kH~2 z`Q6Jzm6~;x;9jL@Wio1(=zAI+>fwd}Zx+7ag|oWFX0!i|wRaAVMB&zcXJT|FwkNi2 z+qP{xnb@{%+qP|+6HknrcfaRcoO|~E&aL|;m8$&Jsal=>_3CFm>shlHWMV?zseSIc zW1+jIqYf>vbscTtCYLOUNltpIMS-AOI|mReoYA8!{KR*}h9(H&umBYhLbagd$?cgkin_qjy|jFZz+s}U1dmv; zGr~=gtyo^&AV7M@AA@i(JT8ZdBGQd?p9_?MEI=i}_iFcXyGhTT`t+NT$DY5SG6?%0 z*Hy(cs?f`$IS5jpZ|#QpL-@hjaB^$*SQ)X1+@rpRi>}Zl*AK0vMtcxjkmFi7R%3?sRFK}aNfTEemcX4T$G6ozZrjV{G9Z$^W()O z+xFMD2lMC04umyomPS$*^28!43yZ1}$imhnr!NNm39GTlQ%1@9Vo;;D z+FsUy(SI`N#z5yJIBVfA2F<^tQ<+_Qat$YHTD0^kv+F!G4r6=8zxMHm=(%zXgqM3} zGH8-H_a|V^RjxF*>SX>rcT-AzF6!0t>9wj5P0W&0s=}h{wdE%two()wn z-x#D9B%t-hAXQjHFl9VGmBMTsgB0>h^vE(ZTY2)*YPyZF3;)i(6L~C~T}LEf)_%A# zG&hh_v_4kMVX_W0=P89LNhHAIL)5C54_O|Bj)p@zK*j@D{V;3tea(SlF1hVe>f)mJ z0o7Q)L8iNz#?797XnjftBVTgr68ukoAS?BbK0s^*P|D5UOe>AtVGUBJB-{1#mOcvo?bI=a?Dt&}ox5lN^()UFAHGN~OwowQwpjnL!-HiUD0)p$%KKoY`d?d{jNch0Sa0{Zq z_d!-;S_=f1QK?bGAs^{z+W0%mH6K}PDTJ2=G`5H!__ol9pB_)&?pu$vj~g}>1a2s zbi;ABh>QF0XMXIIm>Ki_)LX-@3^=t3ctGdIH;a`{0e2%!_XtvaaLE|Yau1rQ_B|`U z|EyUx-k$4!4cO`?PBOD9sPvOF^wl+%tk*T}0W;0&=fDn`K5byjo-pzeID?ItjWOHp zY`WKjX7OGXWYF~YipGEFM=3ZUmPc^g0K~+l^f~?#49%a#+vFQK*>`7tWcaxoxxo_> zz+6W)ad`4d1_#0M$O2~iR7+62W?vTgTx?9%0nh6toGnCyZk@VKK|G)7It5kx1YKWM?~yF4vKhA46^ywbramO*$L z{woBctKbID7cgf+wcqpkFXi!Tf646me+eOx{~e!={!8Q2sT%6@83FP&CEB;{U6bh;_aVzuT6=^PTz zOEXvW=(YXGGwW>J*kq{&N3ihnc$e-nk^XGF)!|m}e!4x~^-UN0K;t8{qDx?u6UaMI6}L}w_w@F6fXz}icuYz zKxS60Nke<6r5awAt#arVdJ$EDmN|wgEY4jpXxn8;2-{-5_|IYQ-`3Wp5rQ7YW(RXQ zMdh7rM;FIVeb!}AFwg*I@MwzsFq+&GJNoIIuSA8?klQp}@-o7rVyZ!BEwQo=W*M^8 zZk74Q3vXXuNJ(Gbown%`qhCnIB8>K>6bxJv?=>jPiI!72A5lm2hsuQ`ZmUOmopely zObrdKbRP7TFE6F1^1-XLY2`5{$%e`Mg4sjrS8cCGO1T~ddwm{NdZ|}z6zGC-~%H5_!khCO@5yFT{a%n`!XiI;XqDRJ_ zyOVcQ5$MHL#p~e8-IET^AN?c}V55S+b0VLGXId(jpEwmkY;7rGQR5J8>hB0gS+OQa zL|R$LYJqQ9Bx8U@q-I!dRG2Q5BC+@NLb_x5xi!TL8UZReAvc)wnxzzJ?^l#?iF}HH z0P36s8Q5XdCW@y}#l&(T-W=BroX%o%)S%;gF~cvTxfnVLI;)|2Zz?31d?Wg$7LJi- zc;rJ;46diKh2o?q9>2R&w>ATjKGrYUlA8!FT1RGQ1j$>btJX$XKN;Qc#6(bEg0|#w zQ0}8^BAIsUQPT6fDhu-z5pt63yLI60#zl-jl|@wVp40!>`xRg_a-#bph5lQz8lr-t zg(ya}#LkFVuO8)qp0^^x(Hq(Ym zcYp`Ru_t`*fyrp2HxM4=lWL@g)j(GNr__M#@h4Dks(t4T{Qa-3*$9xRaZ$f(mV$^D z8YV~0NaHK{U{7)4)A8hvd);^Gp)0n7SGx#-D>x-!hw9t_9tg{}uHXoIGsf7t(5jr| zCOjHL{Tz-~FK0OuZ~lhFGS1_lxn7NhVSLg!nAPP+xqUk0SWFFsk-|z0-#593uXV!+ z`nPb|#C2fCkMs%)^h?YHCT)8OYuuU11+b-KVvB~DQO?OKoC@uYciS6i7p1ODoTDzk zx77ksNF?q7BYcp;RbT(M(l5yr56VA{$s0x}n_WnUDlDbX?&jAXt!4x6-2HIAs~0bK z+;w3RJa`%&Cztw!{Wb~fnu1e7DC0bxzi*9z*NXc@8e?mK)S6 zf`j~IZ3z^-0NUYR=|P6#z0VO^r&`mSl`bmTeVHiOL@CUJxvtoYi!4cxo$Uap-Uz}2 ziJCFRmiuss?&tnKY_#E#Bn;HKpqy^ejNk(yLiJ%)LT|Fk6!(bEN+Y2EQO5RGU8Fqa zkPEBlkclI2uEvkSya#gDS!qGMd%NZMo!Q2JAE>N@;x{VZ)Z|Ecp#R$UJ)D7`9bn^d zeArxvl-tl8<2j4K#2@bS?&+%ruXpAC2j9Ve8-~Ky`Hy`Yk0J?8hX3JC(??~CA=0t` z<(IQZ{!?g2$t|%@6nG<#;{mmA#93846kc4zDPOOTKtU6k|8T*21|_{JIO9u77Oh95 z$f%p5i6jCoT$5?ux5+APdqs#!GOBc{HibE0al@WR-GO6MqkDzd?<$qW?-c;YD5 z^S#3@34m@Bpg)H86YvboD%lWrvSjz>1!!9DP{9kOqx`9=4&Nig;6%H6S%8i_4t5bku4*H79j> zJ>RyYZ`D=NSX7Z7Zj|YbuBLdWRtJb1jIHyT;q^#V)%+*H5<_-J7QtgxN6r7}R z;Rfm@)+le{|LwVJrNp6r%ARdYaORnk0UEBcR&_y9Ois*@N-lT=>|rzPr(8KnO{wZq zqFR@>-sm3AIytBG0j;^%pVTgJtgT`_k28$YKHv5gw}xjB>7*4+r%FzR6;BtjN&W9> zy9MbE(T&e+?Ajk5h5%S8zOaQS%dEsK?EMw`(8^;ui>c1B%hEp=Si{T?*0pTSo4ciV z7imWt##6sb9u_>DW$vh$j-AD`z^1dzy4a8J7|rr+0U{R(o_+A(g(c@ArU_Y~BP$a(#%*D1E$i{=?-hhdoU>&NhtwKS#v$X)4o zMyZvLhRTej(l!=`D*h;`zR~UqxE~)mfnL87p;}^paA3?y8s3|3McXc?^gB zS3|p_HU@P5bzL?3AFr#j{*N2l|50V>?7Xl$!%=7X_&8l}eep)1pteZ|Jm-y&&g>3M+UA$?r@u zl8(N#ZOFS1W2sg9QMS$`SdOdU)CO9Q>|p1XCyj!~l5F<|+O{0h;hk3;#{u!%{Oc3g zER_A*G)GCo4D^eShY{sDHDavq$>4pxxQ^(&s(oBukmm= z)e7-M|Mh>m-XNJdnUtB@_rV1F@y#cJwGPjHA>djYLHl-#M|=BQh5?O8szJIeH&bn; zt0gw#Lvow@tOIu=y~PxYdm$uvw47h%^QyZAmQFY$ANYF6bgclX@Fvx?<5x9X5O*Jj z%&t}usjmY4>9uqbi|3^Wbu(cy<4!V|xw5ar*2OTeyti9_Vtt~lxu3QepMI8Q6GQgX zq>q`UmV?*tkRPlNX}+B^?H<6k0q`nvqyHp`Zh|o*8k;E)Zip)pXX*WVD|rI>S0Uxd z_Urb)3hDEYg+%#(71B!2(ZJNmo<>O#^xJp5ngRsizn+(`NBZ`ae)-qe-y270|Mubj zZAmuMH?uTzbd&n`-}o>5DEyCs)sS6>wnuzhZgYb#zeO006>~0#DHfoWm2pr^U_S^& z8*QDyqx_HM3Uu5j)YWwYcuWsGo>B+?O+K8-Qu=~(PFOhQ^kGKoRmNTB*R<;8wfXoP z$_-LXZ2&y>9QM@C8uQo4-0c5rhc#L znQgWf9oF%NMQ4mHozq$pzX|jJA~zt)dx|q@!#b?B=W|NttFlSgLKsNk}*bLUeo4c zm*CXTnIo~H_{3f&(=Jr2`YkczD%m$St!56Z^sn-5&U7qzUaCIC7-Og~xU+}gzLxiQ z)|O&q8&2sSS$N(I=~31=s}_n-aUB zB{x&dc(haSg2a)%iW1Jv74MY3l3v*YRKsu~<;Hw-zNQVdx+wFNjr%<^NXw-G_8_YO zhC}gg5QN#k*)*=T1>a>0z7}=n8D{GbSIKYb*i1xv<`Po>9#}q*poaejb-+7s z6NGw(Rf-`dzgiiG9jZmNUE+P7Q3tFqk>99=-@^Z>%R1?(#T=czvceNtO$-&9hv0#N zSf7=XE*_$q3eZz5vooL4e-8f!y?GIO2{Wfv>;$lx3rlmyqYPw!c~6ROivlV7detQ*gOw7=r^oQE=E60otp z33P_+s7EFI{O%3%pAf;{ig}U?VQ5cZu|ry8tn2t% zRiAK~a-nAUe0zP({&sXj?~6F2G_jLU7?+}QZ3iTGVz&{uZ}r@YIIP9yowqX&Vz#AF zlan(NbAWPXzq|#H`_F5p z9eYyA(&SGOKX@Jl71nfTlmmAj;*3~-6mu3RyFa+gRCu5SF5MQKw99+x?Xq%?1rrid zX3)Z>YGu>MQ(qX9%ALD8$5*G&kDm(6xhdEir+Dl^E??YI&C`{V3y($ly(V0IT~f~z zV|5|Uuy8F}oWn(z7D>9vGga!k0gSIUbTpCC@7Cr8DLiTRixn_Z?tSlX9R=ZxVcjU= zhA{7iTs3B*)Kl{&2T&I8(pS+^c6hmd9aU=wutX`|0}l5O1$)PGnPGcnuVZ$XGz8OM z@F-}K(C16t-o2-t-7Ew;b^{69XHOnmO=G)P{k`mKocbn^N$y=ZPJHeeY!G0B`r!3> zw;X)Lwj>qHj?n1q(P8v@PNFfkOdu$o5NIaK3>ui9iJ?H1IYP>^J$X%EPjz7q zpd$3JGb5<>6ZaP`532RXgP6}LcOW9%)HjvwQdo+yWR1NS-ydDrOi1-Jw{09gs0PbR zOw2(3$^xwFGltK;AytkjsdEVgc=P`322P@R3mchkNb56u$;yErncYtg4g;E+IkU`> z+Gp#@7E=tmV_Y@`JRF%uj2Zv5GCMRfB~lyt^c%5B3DfnMmYm>W<^jvz@R#`+`N;n? zyS1^k_1fSPdjzkUhyLdijVd(l19JwoI~dc zet!0M-}Z-o2o3c8XRi(%ejVrjUD@l{tQ8M4%}Mo4VTclLHWY~?8#WlR(6e_^+X|%q z?c4c|D$??)hcBz4Y+qxFI8#h7xEwNWUIgayBJGM=85G-5DLGITi|@btMKc6(#NS_7 zQTa!#(EU%a^0goJcTmy#irhx?mPV+vRMjI(So2f1ki64NPYP2J!{kja>S~n|A5xmcH=GOiitX4f`_bWFKAP@t z8v`uxl6rE3gw|5L{jZ3sec({s5xRiz{U_0>=EEAw;0UZbDDJ2k{|rA4C~iI3vmk{k zyL5bIxDByn^&d2?iQ*K$aSQHHsvUMMotx0XoQ5l)`t7WyYFHNXFB*LH>{PwRhRmaJtb+-*tMG`P{w6YFpdQ^ zTC5apy!OQ?Fr)+g@1w3&0!&$h2nnCDJ#?#Z!>2qu2IYR$4d$5~&+krfL?RZ7B#8G5 z=(aGFl%V#W$Y1EKhbOs8;@bh*$FPGg)MC*54B2xB&EjhIr45E_rR0oKB1xd8Bd;PG zj6%%Y2nx%O_qpc43y(W4W+Xrpiu*YcB=;BGxghUtax@?f?zh1`%UagO+)syf)3|j)%w$0CSovhGtlf!pke;_ z#(qPxq~BlOrOow>2~>&-LEphk`pdt{ zc@(i_Hecz=eDMZFZKeF{mqZhlHuddXWG85h!X**H*b->A7|;5f6p6xdp);*tz!NSY80hx5WkijteaMeLDZqBWVxa7 z4}eukx241&t>AOy;UdEZCdDN68*cilP|17(IWpXTK|}lq`IlRdZi|vsEYK8RUf<)w z?e1t&vg`Bd4YWsyvRIFx85(6O0^cS-Mi@Z|lL*rUJq}u4OiNGn02&jp6t|27*e{n4 zZLCp1^^RQDs*|j8hq<)2)k$-(Y;e>713W7cH7Hz}%fY5kR?Y9W&7yQE{PEhVbkYd{ z=MqTObB7DM)Gu*ZA5bk>976`GOV>8kOTqlHjl|cVOw(|mkUu(4cR9Y7Dwbe**ry<_ z;m}RQ=wB~jf)IvATd-s#VTb)Pz?Di8&xbv~)%H+mPIobls+@hNvSHV1&c;R2Ds}i; z0ek+H&>3GGd3WH+qX>iOkMAHuwoB8>2?27-VK;oY%-M+2R*->-q2Q9s%+oD!mdGR8 zu@@F4%Z|eO8ZPY2dPZ|Pf3AJPGJtJ%#>}Ldb4Sb*BoHl7Xe44e!Yl7vF7B3wxzaNP zO1>Rt?y!jWi$b8{EY~r8N(-k!ib7e*;m~Mgb0-$FsbFl#`VcS_GbZaYEk|Yu7dwJl z66s7R2IfIG8ndo_PN(=G!;6{RMEeFE6gdt^{@}xpV@)E$uri;za0X&XaE6Oe*AX19 zyu&m<72kA1GMYZ`dj<7UTt-kAx1H6A{RG zWEY>+WZ*1U^hmEdK;^Gx#LBi37~L|>!4KVCjZG)v6U;n80%^P!<~{FNHaBL9P2~;Z zA(IZ`JQ)3}e`Lm{=7ZSc~~_i>QQq*Iy*L0g#<;{fIMdq@I6y1=h`_#MY9F@UM_ zYfbj$F!&|0_qNpRCgX1r+h5M$cBDsLXbv)x#9J_+V}IymEcLQZdSxgP?^4k$19zlO z6l?F1m%t-_IAovtOIrC#4o0Mwx={{ci5cKI49S-6+1~2n-@NQ>v}N2&%;C@Mk2MTiV2?0RhAQ5{OP3fd!yXPb z%^VzMO`q?P`Io{$u70UN`t{b&{*|Ng_mTwp-@X+2ZEP%!^sN8;7h%@99RCj z_?Vv+wK$w}i=eY1BwTXLFDgMp0&oucmKs~X?36_2Ir(zAx-_XoZXy{s@wYv2Jjeom zv)#RZ2wx*$|CA(B_;ngbO z?p2)pNIU^mi%f;3G-ej|jK0PyNcI>L*b!6bPDqO#yH~dgO3!1Q`pQ{p;qc;NeN0ia z-3l5#Vf2CzPSdb;9?u(5No2+4t;xuP$-4D`P5$>nYx^LV$f~bHr>aH?_ulrM-?&h{ z?XtV!@}d4|PhfcCTAn$RvSR>&grGlOlW9CvFuPdf(xq3s3Qso=I`IAe>T>H;d;;BQ zXAzZBboC}f09m?zT|?e>(BlccRFV|L6;qS!26Va+P{J!I1*XKDq>{SYg zZKu{np6a_SA%ylScfr-wge-zIz;NB20OgA|vRp;GFY|6i+z_RP*6B@~=AM@PUO7wm zKyMa4Lquz_x_$k=hm*&koF6W>(t}^wh^@Y2JU$scMekoKCb z^W66qCIP*wLtq%7P@P3@Dj0e7fGM(11r!mN_c``GWTs<%%`gQEmmGMUG3wrD78e5} zG}d=f+PxM^Ij$v;hO_~BVJ5!4tSkE<6HS6nmZ>(Zk#NZl+=P@=dV7y{?(BE(HI5p7 ziXkpWZFH$#PCcJpykVeiMui1ZuPIN)$M?`;U5*egp_AGvv004yuW$qIN@E`Sp3{AA zUTzFDb>y|>1IXE|2`&*+RBkE+ocFsb8e9(Vxo*)ao(@ltPcZJ~^?x3uT zx5wzB*g5?G(p^R|I*BYI1j8%%{I+6;*0<>pVdpy^e2lG0uKwSg@7{A@a#Nq7XjVMr z8s|Yb+GZ6%#`7R0sxk;;$!x_OwVXc6ykjide)^d1sPL{NClXs6*wR)*JC-0lys9cr9u zJm2ObI{)TBwmiNr*SxT>h$HyfJp`5~yIPSRG*OeRO=y7G*d!Wkr9>SFFlGIa!@{@^ zuzu^ZiU6CX_O24}Na1BmyKQ!qDzye73DRx^YKKF_tzF|CiS-67BhV@d+{wP4ifiYp zgep2gXlegAO-czOXMbg_7Vs}c^Voj1wnb~dYT>+#;S5(Ix(i$Uv!%c?jO?K??jlaU zk7{M(4nz;<&3^`{IjYe7A&@%TWQ=a$RX2!ZKXDw+?1s7jmeq-YGGb}TDtoc{CNJ*} zd~pMe&SZElUFUZ{Ze(sV_zyc~6)A^tJIh`r8t*pp^srZ7i8YP=Mq!>uAMuUzjDY<6 zrjW4vla}g&pcs!ohFAmWb=^c4J#-emklb)1t*|o1P*zYl?_s3DF+74D+`)Z=@M_j`_4L35aSv1lq3`G z#4!N@HgHfZk z1gY$;Fv|`^`99w8VG#j0-{@iCqLb$9>!NyqS?h)Fen4x}wyp0A(kp%pqsliw&voyg zXx+QZI1wfm4ZDYRST~nxyvUPtB?N1-bsqQsaE}nC6+qp;b)zwo-*bRUi^Ti??O$p;F(C>D;Oe=5i>RMf}v(&Qit{iv67%gaG!GWS2P-s z{wW-I4CGBpKhR8l)t=Gb0*cf38*_={upRc*QJmnRZL}SmAJ^3g-nGT#VjT-OU*YcF zc+pWB({B+YWO)EXNzdp(Tdq;tFtkj^2PC^7fwUrsx?8|J&yNKf-MAr|&?}0u8>Y)0 zOv4+iYN$%{SjMd(dzqV;oGhmfVNvE8oIGvZ9BY6q8Gqo~d;`S{KbrDL$it>u#lsO( z3gh(bGK;CxqXKO-#MZqntjbA0z-y+MG5YlQU){u-;HOo`7cW@;kr#j8P5eK3@n1(9 z${PQ=#QGr}Z=7b>(ohImFfs_|U>3R&Feh&&@k@VhsYoif#FidCy?2yQ(zxsoSP4&$ ziO;W&dp^am5p`-$eX7ss>N9SJ`I!PC0k;%~hm3lf?XIb}=SQ1vVAdcTfs;W;I4)Ni zN(TMWK)P@?$Y;3DiD0-MrCLpBgYV0Oo39Am5PU<9;M_>BFtr;O-%vgH{1EtAiinVi zN)Wj9Ptukv<^pmpg3`3-kR-~{0Ji~pB}Xk&7EFypaA_IihSmon3=U=pBO7}XoP`bs zbWBPuh2%?c{)$IQ^72warbDuoih8T^(9X3j8MoB(W?EF`L5WT}VuUI4C@|KmMPoDD zaWmIF7Z)=Sp)X?{V{mr9D@jGg31PV_MPePLH|(j0O8VT(KnuiN{Mp^YN)22G&(0De+Jrq`8P)s{VGof7mTziB2~f&wIsKj zTD8-cehW>8Fha!FJ`maA@flnnlNSxzdY`}i9>Bd?*o7?DMmT08VJpRx~2BuxtI`@_k?baRRQQW>Z0VOJR8P$+nkts-udA9r|` zmS-q|5!6{WtKqO#UZ+xq0gqTsG%}mDGL#fbBg;-{Oxh0) z3AWG*v&f3&)}$5LD*f~@cR56++0B%<{Jy+^Xfj;0`~jFiRq0Me2{-+`ALV6gOBESf zvIB;WEu>N0X-ksAJk%p6{od%{cA`TTDurY-JAZ+44<$^ulyQHT7&AjD#Aea6$DN(?I>F%9eu6-X?^U z3;=7l4!VerHPZrWH?n4QY0F&O61`8K1X*ylc)YgNl9hY^b5GKu6W}dOjSw4l<^w+o z_9zajw(CB3)BBW^a^_sNddM`C8&KEAG7QE!Fnvss;UTlV#Yb7hPhym`=Xjb}1iwP| zYI^Q|vm26oHmQoZ;fnxMzb^ghNH!l{gv*g91f4)z)W?7sF08!nYHf25+(tGgb~&xQ zKfTxNvsSFXwDh6i4!dxNFdJ<0UrD)a%0%%XLr1&;Gk@gTIt1EN2ssdv^h3aV(@CDkct!b=@>vt) zNMU9r5Mrj0M(BeYH z<7+zYmm9J2t8mez{Qb7}nXAvEtWBuOcWsAFRS&$3NYR$*B>T+@DVG^rm()<*B=RLw ziF2blBE5#0E6DpBFs=v|*$PonU-nz`xfaKN%*I~hpl{n(*4a+vT&O2md&EM(CsZss zT53Btxy8@jkt(cligm>y^3ZHSQhwYL=O!rIloghZHkvB;ci-IzE= za~}u{A>fd?{tAZo^c(KGrK6r77kk;xx9K2tumJ-~;ZIqbZ{a;hXP-6wF@q(>2`oYA zBe>(S25J{O1ex|78Gituz&F{HW!^1PZQ}b@nLjs=ZSzcf`k9+|s`3ILfb7kij|9iP zuH}v62!RK$<_*#ByJu+a%&a|T?q2if8&OoMi|2v?lL-8`@%!&4;8JhuFVd1^PhGPae77}&UpGpNC z&lra-h&Smy-T&$~vqHk&h`(gyv40#}G5$}OB&%otwg3I!t5}7~7Jp5ymQ|LV9Fr-bLMC_Af+$=vq zFC1ThiT4?Sn2fkhA978U1p#eq=;nN^$uZpQF&3|3c?k072(2pQ5uf(xn4QCVmujUoA& zK3b@Tidr+sV)J-Y+99%2Z2K{_Vdtx%#FZX+Rhy*sDjb-m44+a|tV_k4kaS$7N-Jh`=n<}Ff0u3u3&pxiSQ8B{92{kTm;XKgZyE^7#L z_7ucpo5cIbGh%Yr3xDVS-qxo@Kll+-t9LFeGrWd7k}kH z)OLNaFR*UAj)}XQv$C~R`EztIN@d{YXX!Eb;(?DWg~`+7knyy-bjE%KRNkkM7>=}y z3)zWjQJEh`U`cE_SoYpNLM;N00YSv{4WSfo37gvY!w@=w3& zYsv^tD0`FdS95m=-PN9XMozQZMZ&8lA#Ux;Du&cG{F+|+gJS7va`Fd`v${z zN*AWAKu4g&AP1~6=o&WI(7)<`7cZFl#aqW&E8iY5m;~%cXU^eloY8d*~ZBHx%1D?;7 znp;AqI_jTU&aQAG6z@CVV^)g?7L-pqHe5w^!Hk1p@y4F?vV zxA(j1Z^Cj_BG7eqjQdT5h%ha`nlY}KiHTb0f01n{(P~Ab)zM9eenb&I>W_$d^8~pN zWh=#07yGk;!XiyTFJLIk`4HpT1C6yERV6rz8}uyR_K?O90K1wU4Mq)&~_%yPbn> zsx3ef6NRdI2r(ox4#&L8qB%(jtLYwqd@3}Vol#WjX(;um!?v$)thl({MRe8SZ^SC( z0nQ0($%WQYp&E!xmK$gqB1+ZDQ!~mr=#y`JVO51x9F(0@at>Kxd{gk3t9~moaxT*X z!-$v8dPnFnV;gUJM@SvkoVQf;DWqylG@@z_*C?ZNu-Wpm#LV>%`s3grEvfRVle zO#HBr_<`NZK%hB{lE2Qqr_6-VRZA|sdz?Qo@0s3l@BUAzY(VLwkECi4r>=impPZ+N25TlmFfbcMZm9e)vY9Ri6x7owb_dF$bI6*RiE#1@_?R41Xa#R7CeJ5d$|^%JR==67a%#e z_^k|I%R^RPj;r7E#}y+%hCO7>N#*i1LWG+rc-wMgy2RYWKUIcOhFB3>Ca;@mM?R?# z6vH3~Qp*BKSqqyyvjKZh6-ZewqBc7g7FMMf53^OO)qMv{4I)Rmj-V{ zuvdC-(^BI<@Bp8j39dO*t~n&|i(mV>Mk8AGynUi@u6?FE7F(>aTg1wdR;%rU`MK^fOSqI@|$G_(q*^ikN3W)rZq^M5^QRj>Q$<40)-PDKnxzL2^5 z{~ww5dJazZf8#Nz{7Z~P+a!_VkYeXQkOzShDoG(u;B6H{)R2Ibw}hTk@1Y@pmD705G&WR>%?+koJQKW;opFDt2sR&Srj18u zLDNDH!6l(V+XCN5*C+9lB+QJI_$muG z#Hf2OiQI0*J7e=p$rDM;j`HnNg=0M!ZNAR57Hr8Gm4Vu;ZHDCo zT-Ox zSDJ(m$#`sPx>o9r7+V>@_~k%m4QKo zbtGqC6yL&ufn7kQ-@#L#Am+=g9oNZsa)eJhEvALfnb0ebmru;pjM5Yfc?`H98VI_& zTgpi)ZD`z$6nS6Z6@dB~SN9}Lew$Y!cPJ^70|BS&l|S>u-#d>M5{(~@=H3rs)Ye)G zk|o&G>y+b6*Ir4;aN2ORgHDF5%_-!W8c4(Iga64G2gDT)xvDQoB#D!856aM0bcv#< zjjYXLmdJUdIB1|RX4h{8G5xp!JCW;u-A(EwnC$eLOb0&+p5|(MRC&m}7{7V^oAVqf*p4ZCV3MUW#`XWD>3j7TZYz# zlmi{(Dg3;)2~q&3h1l!LHClXHeB?|me#t5|`@zIp)K(fZPZL9}5R1D>$UjB32<`f3 zsRl)B1c_hKI8;)v!+(m&QBRxH!R~tdPemO{K5#e=CD(VK zk3#uT`fQ&;0`E<>J89-JN6}a$b?rpQL9(v##54PCpu)%NM=dJ6FM^R|Z(C!9D^SwP zu#;{PO1lt|9+G85lEe&iLWv;4uO43qT}~SihW(M+`OChwkeB)K^o3X?z(09L{@yMs z@PBrtVva^uf7g;~s9=5#dwxKsN}}Nx5~&7k38oq5lvXy*2`0?xmcrHGHMyRP*-L_v zn9!z{-YVP=lKcq-*OJi7wP^Kpp!y8-5!^JP2Z@tKJrS5P%JzErcxZm)j_3J!`H}%? z_UF;2cABDCwa*23ie7EO)tC-muGx(lJK+6;*5x`%kJOkpBK4&w9~ln}9PPCGH83t2 zOqni|%JQaYYe@tD56a##$g*|Y7OhI#wr$(CZQEw0X0p<@Z5x%9wr$(atbDolK4-_f z=ias6eGxO}&lxku_(p5Jx6ylR8I*P%`Nv6PYiZjA2`!?s67FSf6HLbyYNAd{70`eY zWZhBOswz|SV=EGK$+0X$2~zn(+NMc_Z0FH^D}$N%{OyH^{O-X>Hc2q_ETont&kdzF z0SvbawIIV&%*P{~H8j#Cr~N=`t58AGRa;wo+~p2OEa5hS$?=h2&>o6{R;EMfOfcl= z>@UjMb#0X=2%)s-; zL!NMQNuQ->mF=$5YQvIDt|Bdzq|m}6b{1u@u+T0q0pz~z7*U{*#rLw@oTuRAL-4g-JG~^wwW%(MhYp|8nR*@mTnl$E>X4>Hd<#7^gj%b9B#10{d4vNXwpNkqWqe3FyvsW#0$I$t z@8R1o^zSE>W5sKOdoKK>P`Q&kvf{o(S)1yVXE(*tb)_4-UKRXO_|gXM9n0siTY;&> zt#=snHH!NXlWj;382o}#uzI8_Fa+N}=r9mI`8X=`oL!>os~wIZOP;a{x6zHHbaU)i zFupvL{pB?leBvE=FoZ&9AOOn`9?1xnr)eDNtAL`3oasB@3n319WB!R=)!?{bxhfW+ z4iRN+dIOYeb=fmxTXS?Rb79&k^bt5#-R&pq^nR9%Lp~uG>4Y~3W}k3Ht$QYvS^j); zEBrXT_y>S{_uJdlv>dbsP#23CMc5fe$tO5+tK_xb&38SbEJK)WD82ig4BAq%lWr6N z-uZM3OWm)JZGhZt#3lk3>ajS9Axq33po<&4{GeAlL~#lC8Fq_lFZ3zjEg{Ss*Aib9 zu{*sVrj@cnetS<4ahM(>;FL3ShxW%?1HE#gBXPuJ4|EA$2vEwdn6+8t)kz~KjcuXu zJwo;t>U(o_iuw+3Ih9_mqV(LN&Vb>>>2lS$A$xM-M&;~-)=1gWHQT3 zv3fLYos4)b^`Q6CW4MC9>L51MnKCBwILNcadhk}(Ja7~J5|#27u%ZUcvx;8+za&KO zh!K9{FDL{3$7+%F?JAmku)xsX_9t+C#d5{xvY=uJyq#pl9qomu7NAUzr z$dbs--FAXeM^d=agHb==ARTB#xsqlq*wzY+#iwYk-UbNR$URA+_E$l<99*3~J;+Qj zSIKNvdi4X{P&zLzcBNZGL^a!(H+9;2r0oWpqgWr@3XzG7?$a1g)^?2;q~T^}n8>Z|8t4``?gUc|;3(Wm6@)-uqBFh6;; zG5f`=bF%5cKeyng-(uw_kqk?Rel^R9sW0zt4l8dkW;K*%tvty)WUKM~M=n@POXN7Z z_fa+4yeal{nTmW#ABtPu7-N&rbCAb;)LGU$xw`mOzaF+xWLe?C+}yfYm2J4xJw&lp zbnTJ5Sld(wB(9}c4N(0F2!!`M8A!h{*A&RAwe81kxVKt}tzx`v1s$TBr%8rI7C?38 zZ$z@(Zvu+bX{T6;$k64cVX_IQEICY$a#U73t7aX$jRi53s9v<0%49YhFPF?@Zocqn zXQ`oj4tq#$pl;VCnyo{tiDYt0gZ647(!Pz-o!qE6QG19`&0xJS@vzYl#kVW-K<<*6 zbyB49F4{F-SIe!y5Kt796vYHYa2u#4)F6|iqGlR!SH@`uOvW2~bLpdcvypBvg06x+ zmbOO97uFW0D&Me0*PE(|sSSL`K^d-WI0F^?qn`{4wgj5{gVgh$e?JU2>o#Yx{Dnb7 z2ExY1ulyO0&Q;^gdAdt!tiJ4cA@HX6Zf99RaZR74#d1$p3CL<8c@TO{<8?7_Y6{ye zjZt%A8&#LLRg1jmS2sQDW4Wy@?oH7Wpr;U>wu`vH)C(FjV`VY2&qqn00*mS6921;; zAO4M(kE&{unm{j#zV-8RIA8I z^3)k@?s=B`N6WLm0rsaI!%}@5r`=IGEcbMuC%&6gcVs%z5L58zd_8M^W&Zu~|09dJMJ12ib#g_35NAW$-KTXTnJF19)|L_cPm!i_5c?vU6PN z@2)>#)D4%BOIU1VoF2CqKZu=q?5!rC`&;UMxVkLWy>x(`0FUE3M6V3r`0sKsJ7lBK zO{Yb|2xm8vJA#FP-2_!;knW}k?LumG1{u4kn}$W-=?Lf)k<}7yR6BQ`iAYeQFRJoP zjN6qNpE;p%y$gH4Lj(Wt@R;Z(lbxm4Z&uY{;%p}&lrL^Fclfw3ZnB@j^DY0lq(Ak@ zy?L8Z+POZ&gL9>M9`qyprhh#qg_Qbqv!b0h<|~ro?p}w=cebi4`DV`FgNqZ%6lCy7 zRG9$+;M#?mlQb!C1RRo0;)R8#@eceLbxcG>bin;DpJ2OZ*J=5$H`4F_n2Pd$Q-vy9 zdi@=2t7%b?ZXNNSU-|#JhyKw}i*zi^ z7yW^u>d*v^81-O)U;VJ{8x?6N)Mo<3xNn?_%U|ntzyyx}!BlNJ{FDR9hY9A7U8cLz&hXwju$f zlP}AXSmkS;n^x0T=R2*0-RC9OSRTsFm(|js?3)WcAwMoOtSd4+j`YASTnq{M#aN2W zz>y$B=Za7-;)>JLRn;T2FCpfA4)LxqT*ut*)35gqlG;Y06d@5GSW2qBk>I+a1cZXi zNq&!s%4l$!dxF3jkBm81VmvmaZGHYlrR6c>q9DnB|&H7JQ4&sah-PSJV8EhtKIHB6i( zC$iy4xiclTl^7()*gvZ^6>(`ceo3q>tV;_g_E(J;){jnQU9 zx5l3cSAk{hu4B-^yp3gc7UZvHP$Z+xS1J#d!Xz_s>Skk>h5^9=3_6jxeM%0Io=UY? z>8hlo1GvSiKK+$tOROz~R3_`?sCcjGC!0(k?S`-+Q@4^hzd|K(dIfK>p3l7jZM6Oa zD?Ui3G!)Mi;iBtuyKt9G?(P5sA&Pn2RTFw>{#nWOeqTl(8i0H}1{mujS9k;6V8ma6M?@zWCs~&j8a!W379t=yQWQf(qUYzI%H!Cjl?U#3Ob|tAzL^ zz~SU+j`w#2YR%?AS#Qox8^qPqa=W?!m=f-aqJ|&8j&F7du+OT85;}06R z-iyLFXZ_S>F!8W1A855oT6`^TR+|ycO&<`apQ^%rm}$ z>v985Qa?pt8uKTt`l>B*8#daT6Bu)Nm?#4dKhw;%lPXZ&Z z=R7|9&%=|ib73Cuj5E5-U)-7S4mpQ(&iL`tu$(Ei@yE<-t*B8jf1;K*%)_2Y z*`|qomIdnB8v=N-m)|y$v1hg~n|jyL5`yw9gKUwo=D9^nRP&)}Ll^>YXf!uk0yZCT zV}sTR_HbiwriXNSylRWA0~Jx)=}euc6h5Ff;vQ@+wOz)}+R*#VfW@Le$@>7=vxOg- z-DuvPyt(xw{6VAgy0OVJN3qobvDLgXq76?X!kzxpUc}6uxp|10eX^N92h%3Z9rU7^ ze>=B2QQ?6d0`=3I#eJiF693WjuW&uI1(c2JuaX$+A4_7kzb%PHOpR^6BJ}Lc1^=^b z{x>zT>VGyuB{c|viqsSu#nRy|DNwB?Wr`4JSQTgx*UGc9NzCIfY~&mo&SdC5us6?8 z(YXo?%bDe_xaRN=p0g*A;u#hY=pTJ9IH&G9^^ZE=-@X z2E?)KL>K@`2z+WEvI~_Vv5LNG{p5(N*>euk{UtD3S!)OBwHRp7O3NooV`!u$N|r@k z_$Qr|r$VdTS(X68PJ0#77F=lt9=uZpH%kL;QI@e}M+e^IMA2qE*K@G1H7C=x+6ewWi_kaO3*JQ~`8IQs zuxBpM)x={^S%O>1N*dT?_H3X7Z0!rRZrDysjFf7{1<8KHXiJM?iCNfGLUqWTb%Kux z3gTQI+JMp25cQHlRa3_PqPOVApY0qB>0qQQC(XqGSSTyK#a0^R`O_cW@y4l1_qdyt zWxq61lHT3n*fYF~m03;3xszuYgJf|PJFAIfXkl|sT7yIZkwJ#7RoC-bjLMFzk!CT; ztrGqgaZE2XcPjo^+k@I&83I-kgzB85Yj;e7DD&n}_ zB1J=KDq1RF1t?s?HW<+D^xqUgUv~0hQR{jAnr|o33Q|DR0zSxDU+CYIj~q}&kS-G~ zz;Je!0hY^EjfJ&0O6HyY+N62A5+|KOq7QtV1+VytB|BfgGkkQ3+Q+crzS0^AQX69g z@^n*V1wpEEN7631ws`Xm9<`77A&0JJ?Bk(rh*l51xz=kp-2LPxtFR?wlStLl4*r?p zC&5p1hk(I`My32sabFTom}Hp`xUCwNyFH>N$xgwBl}S6DUl~8RPjjap zJ~FQUWLz@!h;pcy;$0!fu&2MncF!|EV`dX>_baC8o`58KYZT}%Qfv}JdutZxsy$pe zr9ALr%?t=s8TkrOL%IHukK*MKbC9woE<|ZW%#N6D{duDghEmxMbw9}|->0($btA?; z(kvQ7dbNTkSDYjN09Kd-!3Z<=)ao+h}Q^r1O?!$~!t-3Cjmpx75|=b|PVt zG3gsYlAjKt`|lt_sVZs-uwN2;Y{}^T*$v9iy%#AC3k?rg|F*Rt-dAe}`+^+Ne}tUB zFXjFNIbxQkHYWdPwCPg&cap=PTW50viCubeBP@!Pgbn@0EC3A)TR8n+&N#@k*eTT) zmYoY;IFEt*IX`~WZ{ud)ep7N(iB;J8x37gYc{Aej50B-x%(RzDcRS{{wJZJ)plv2T zc|)W~Ntx{`$I@1=XloDcK5oh=L&ku!di{7=zJS2K}!s~rb%1C zOZ|4Wo@HC-?t&F9ug|_bLUba6bk*Vd7)LgX~K8O2I`}3 zq$<6eY_0yJHAII|pM>@%kW!{)ICcU?oTg(8LECaMY{6s&#b?f1rM1ggg(hAmDMPh? zmDNUhQrK|3Dg#cKzYXpWRgIR5!1>F1^m)$7fYpWjb#)Yw%JRz1#rtW`Q!d;3<^r)J z-}TEl)Hr~kkk=w#j)n!dBtT;Qz(%cDGi}45R3lk%&j*}JDZnIGxzPA!d zZ%M2Xhr?)corXSl*`dO5eYE@&ETlEXS}8~B@OHxTV5g=StpR4rZFblaI%rqTc`1Dl zz=4hCW;W&FFJn*CIf}2{0`jp7Gw&6_EH`kA7qM^cFy)B zaMwg7@CGnb?tsZLx+qIC?Cuds)t-|b$n63goA8lu&avX``z!>s+&4sNW30{=9A6rW z@2uvd1jlgC1!z8uSnc4{tx2uNkYi}lK==gV#y7Q+>8f+ z1of17zQififb&9J#4lG9rKBt?7jKvdfb+FiKr~?%xWN(B@Pi*}dg`Ha!fi?K)XFc- zp)_BpD@Lg6WL;UL(L9WaN0=t?ujO>*KYKWqvhGdABi+!vT64NpP8Utpi=0@BH_Fsa zo5bNFSs$3jPwfxE>gf&Nv!anz~gZbc`7u-<;aE`7pWOV0G@_q^E_oYrgsa%cV=>NAk&EV}(`!h(=8R-v!XW1N;6C zj{d9ofv`bR3rkd@wy+kJs1IoxP?I)F6snyUs3S;TjIpa9GU3iZUWYfoCC3fhb6ll+SUEgqu}yI;Z47GvqA zIIu+t5d8YX068g@<|{QqU|zr&Sg=46|t;Z`bUt#{m08GM?=* zX$E`i^*aK9XQMZH} z04lk*lSr6t4!h|bPS~f-5~*gUp7a^8Rq9~AR=V8Cq-LiE>pkQ^!x@9Nr?=sRdH4z9 zAEIvCPGCjYW(-Nj)u-hx{sY>V5Vg4lSia|#US-~kx67$B4nFC#oxSgqUWlnWVg;s> zN#}yh9cidQ;g|`J`rSE=7m3I_$7zH)6YB}%o{ydxMj;l0KsZZ8%4337UM${_CxMoq zshh=R4S|(cr>MZ3nOyBk1@ER@oE>$&aID2wF{u^iG#z1Gvl({jATjV{p}1iN1-o0; z()7)#Om$gL=RCo#uB2BMeESgo8eU%8 z`$gi75+@or>7K=3-qgcU^FRnUv)h+A?gF{(oowq#tE*5NCB>n~u7yfxEKb=G zp!s6DS*UYfT(V8q1zhN?@Cswjg%@WK_pSNH5K4PF4mOYE6mft+!J5j=Q6I~L;0d2W z=d`jC^UAfKj!@;Crv(jaVbk3)J7Qmae>zkn}^8)VFqpXd>I z0?Z+L74bBHW_Oqn5|)12hKT3qod+U>7~!kQ(58y_RZ;Un3S?+GRs9=7ea0lOn2dMe zcK~_VQ0-PTo#&`O?~vM@ZH49Sm#6T8%Ub!mcayDay4d|U1?sBJ0@QG>2WBvLct)0D z90Ed290Jbd{G0E9o+~23&fRB;|iw_f;=axBOa7Vq_PzC4V^$gC?v?^0ha!<%YY*gb}|W#Pt?M+xFOLSVyYe| zA+Do0raL~$6Ytgo^#lLwB}J%p774`{AoctsApN~<;D5@af3VC@(^kg$%C*4);JRV{ zlA;SklKd6n9TfL_T|=ae1`<&MhMMdqc{6MBa+@Ktfm!XMfM0lP0UfVVDsP%_^aH^=`H)jv+0Usd7 z_46U__-^XZ5I-8J_Ch00LH7tMHI;Qk1@~6%GRROvrwO!bJ-hb&b4)R1c=r2zQn%oX zYVa{2VV}9m)%6FQJfkFpO9*Wavk*b;Cd+1%8!=%P3=fjtwz6nrfQ1T<^AhV>^Cg>m zh+e+oOKKX_0qUV-%5tV<#wCw18LsTdI9gD>3Oh*ubh>3EtbGYhCKA2&Z%n-k_12~V zT;*!v;@w4=da_Ua=dpaF8PE=@1s=EA5I2fd=pD26-ZbhYAL^eLgI!_NMfxfQm&A-R zu24MTC>B&v1I5AACfN!YI+rRTW3fN|VhpD_ESZDwWIxQA_J0!x>p3Av$|J{F-FH05 zs_!ypN}De>zodL6s_QNQ)8X>w@bz`+Z=#{5*p;`6r(AiuiS9CysGm-XZERlCMC2Zf zn7AEDH8jlp%!om$osSzQmdTp&AB(fJgumduw^>?8)Hdrc*^XXn#wK| z37poTXqtT~3{yryXZ_J!%3$o{uD%S|YLG*HKfyyNHqG06SEPQYCddIWWDAQ85mYCRyGrr{6Kx2}uWXLC|#|O$+{OrD3u&aD(orwB}KW)cGTlqc> zPTd)&(zC^^tgiV)!G1tOv!+?bXNU8{?qjU@VHIH!1d>os9g_u=b=UYLt_{st^>$X>Uh3K(!ROF=bxR9nI) z8`hMG*PuEf5!T&IDL`S#Ovn;Du1KY`mn56Hb3<0Ljq~v(v$Rc2ECpl|1uAEVju-&|Y$@g2*S_>lU6S++tSg{5;+{U4KSBGJ~NT`}$VV%PVXFmvFGP=rf{8rrrP zTVt5LabwZt1qS5>2ZfbW$2+HUL~pBuJF_Nmw-fBAmpW1=d_(z6>7Pn^mc>cMw_5%L z!VrxJck2TDHCFC?8)S2&{K0(o_mp=-sA58*C6%)0_E_Z!s zqA9(=<&kA)Wz=^)ps#jbO?X^hGwywo@2NnUYG1(q-S!QGzW_OY;hN?@D)|4qO|9*J zxvPqpntfRbm?&Eq{;d;`+Sb?V2Ff2gkYreG4d|k(TwBInGRmK*(jmVo_ycWWQ8L18 z7e-~BWSbk>`X;KG-@jyKWcYt8Ok0_+UvXU>no3BG3A3T=_(z*}S$A39lPm8ZQ&;{# ztfG2Uo?Li7ON9BHSMHoXv5NRttHDN7SOje)LodOC?Hb zm5)463CqII#vb?J=4pPJVhx#47UhpR=>B{Tt0XZ36OMw)nn+$kY8@|_L0ig@j>Bs+ zWrP|TdY3O{tGerG1vX8Kve6{N$(3IiZ$B&C2R3+4RV8ii*m zSrs5jo$Wu~b3_?BW>rr6V(H?HoehmcyIXm_EkX%QMSEq+YMX#bH0u8%G8wsm@un_Vok!wvQ27`X} z@?}6}G-S7$7(}ha##0@ef#sA)$*H+lFN4AEg+u+)tSq^)JCRP*NJQOs<#Wl>g4<&? zrcs*A#t;q*Os2CI>r!p*x9G9K<;jbs?_LHPl&Jq0O&U`vW9D%U;||863o9G=;IZ}h>jd2;&O zCH0EZHs29*u_l_ko8B{X{U|sfqSOy5RNQy3ck$90zq6z90S~xFV?=`D!^btEa#Fd<0Mnoh2}3a zvfR9ljp^#NXH?)3atsrXz~OIjT#HFLr&A-&6=p-_;hLQbrVHm9s^)dk3oVwSKSRV! zANV9uPRH>vyd1)I8nmE^M}yE@m^XzQLuPWkc{E^n7*@UVz~^+4>aDAh*{K`jq1#Tv z_mwedGfzlaePNXNzn6uoq)JsX=x{=12kJa{hjYX_4rl>10!K}8~aYF3O8Y6qge|i#WJ&KMF1@Y z;3^d%N@9UmqRN!Nr(3!Anu!PYL3J4Pf~7=w^z_63U!pgN{~;6U7Zln3V~Iuk4?Ul= zv6H2Pi@nqTx!o)JYpL~X{sWFslR!IAGJTb8mCdOB2khc~KUhRDWL;VCAlMvyg;@Y| zZPo!oimrLav(f0#*h?5OObApFj;VAqdSTZO5PqmwT7}oilF7OThSyf zU?6bYt$n@ObEQme&GJf=%l;M&{n5=m%@E=Wi#2a8dH_>RygiYYXQ^jlu9(j1M0brz zgf@XVH@uP%hI=S>T5M15oDpOxLzO6-3L_9bODs*Bw9968(j`xGW`cKvX@7MMX4SPo z6y!6or%xMojH5PVF}$-)F!QmGaq+g4U`1(U!QGri^AiJ?Qnie2gBWH;9H7g;W2n#) zyuH|7)}obpU-g<+zNuM2IV;-LSAl2hgFunsA!S+XS}|w~&@KTn#2_93DU6E?BkWi~ z{l!p03OHcQTzGZEPt3WCkYz`$oI7}nE|ri2ESt?yv5C$wQsNgAC;6q&R=q~rsqi}! z7ZLl7<3BavAFl7iO>}p+)J*5zH-(ui{^12D0{GK%p57$~6zqjfj4dWi3(j0a5?%41?^fEAmG#u;o z(;@bAT{oV;JJ8jppXJ<5OTp>h$-TR(WlYB`66)bQ%S+B{6xM2ua37s3kLcn@BI7uW z58b*f&@+xVV&b&~Trg6(H(h(#iqZ{=zC@t;?FTa;q;GOJGfp4exAl zba1yY_GZCVmM@Xp5}I6@KF`fzkp5H%-^2rg>0HvVzP8ihfby$}`|>;t4&5^LIcG?F zMcnJ_pU=6>4;rHM@^e6EDx^nrb>(%02Z!HS_K}Sd(ic8&eO6J=9=p>sFj4{2AEaC8 zV0^La@um$MW1)*xjq5Lh)P!M=BjFZpP+^FAstd4=G^9Vi+9|hAq4d?A!2jkC{8uXn zS-4FH@`W=C|G2U$@V7YgzpinSNV(emYrBg?(8$@v$cze0eIZ zIc9-rz3zTkK$1#o6D5aia?sLU&&JuSFal*s$|0tNJu<*nW4#j73l6u7|pxpsXko1 z;(I`?ZYA0k$gP8>IXk|Lh$>Zy(Q((X`f;I#?3myC{qjZLa-BJNdlnv}N!0g#yzZ=o zE|gZ942%;hC7VonGV`H6%v`Ez1OG`=2k79bZgK(dlxuz1t7}ECZ0xW8;cys$rf)xg z@VG4qBaXpI#>_6n4l1SxH&5umX@HW9C0gv7ubk?<#<3nR|MQ8#TuH~4u|t50C*1Z- zxby7(V4Hg1KD|DpTo6|Xoy#h(7DPg9nJC}eE!Ur7F(H?A<&d`cPV=2wgS-v#&L+Ol zA6NZkAY%Kqkr~<4SG?H#{m0_m=tXw-5?{a{)9+pEqFd<)Q!~UDSk=lt#As_gksG+;`|r--mr=OYf1SzyaSXH6|2+ZOEZJe%E?}Dn zN{g14$U-Pv7dV?NRVo@`D*#0cs>n7nYqMe}RsTJ3%O^a4vb2EtnbVJe{ma{-SrnT!gm@TZ-NU~cR zJ?PTL#c_n={Dd>+WvokU&mr+~E-nvpg3IwX=BxA|`+8^UC*4|pN?bn{C3N}@2%OE0U0QK7#6(7$uEWP>l9_u+P zlf!6?GSfXJ1+R^{fs<0pG_4j~Ku|PTU&*_cH21SmqKy?gF_ZRGEqj_-6Db}-BYe

    KGn;Ax)x3 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 i^r-z%fZq$B@(6Rdul5G|tKIe{nxb>3><% z9~PQha{CF_|K?fg$|*Ym^(SojaBnkfbN`>k&DGAo*LlYQ@JwO$$Ym`RXWB^P9fY9> z&eBxCp?oiSh8py=R77J4uS*wwonwucq&P)n03AeP+Ix?ScG~nV5nFGCiM-EV%H4C> zQ-3s~n%_iWZKV8G3I}G> zPW(ZaO;IE2Hi z*OBMi2ePeX95+t4oPQ*sZf?$*v9`46L)f>T>!CgfBNDQ35nzZisaErND|qlsr_?!Q zm=nRzAM#~ohw#KVeRDAdhQ^l^6u3{+(b$}7ZK;m3qv7ExIMn@$2Zzdm+`VH?pG;q+ z=J&1|7UL`aTbBg7f|KfuGiRE9UG>RHf`*aE091)bTs8m!3G=|lk>K*(I_@VU`@e?7uW1KrL*iX^y+;bcsO$h4fB5+orq-C0Krtx-?im}92g^~<)a~by2W8dW5`6arpPAou^(pZJ zstKe1Cd5f1NfTX7`myb)^#PTFod?J69TLhSkv;k(Wk00*%Y%y2gE-N|5$Ky&3JeKz zGlqvQE5wJ=CTK<*4%K|`e#NWsvZ(e61t9taADjfBGA+JW z{*S%)y^fx*fwyNt5Zo8xaTHh@f=a62k%fhavfP2>5y^P%Zd6n?FFM2R2>RK)IQ@%v zN}}T9=Bey{HKxc3YHI3y8cowk^jh)c(Ew!9mT@M{n>Oy@)#}qb{f6xmhhe*|6KOSH z`sF=Vec4Z_Iqv%v9HtpZ&-bH5VgqNqn{<0urh^lM8Xmoq?1&J~K96^%b$0PfYEM_* zbox$O?^lvTaUMM;I_xyLKUuFaSuOGvDK+c` z_vwYJ-qY5PXMoxvq#9lPakPBd$zn7`tPy*okExG#r7#&S_Hl~%n6X!z#$a?Q=Z4NC^-FAG5M1kRQ+m+LI3d+QBfa8S^zZD*Q0p=dh^Zi=0>Ls1gKkpuRMl zz)72$$u)s;Xwb!mEsEZ&A}99S5GR~*?4YFM#k6~`TiD3ODC+OxR^3}frUoX;&IUWp zrgOnl{n`h_2sb?Qb&Oi)Da^LrH}bM5tmK55L?L;*lh)7 z9EMgMByZoBP850hlO+pl@})48gO{CWm`||lJjcBKcs@s)2{64lDqsX3{!K^ab~Y1G zz-te5FX7p2_p_KncS|OdjT?YZna)0k*H7sX2ue?w=7xE06mh&liNxaHp_wh^jk{ei zjIxk;^!tl-<;X(fl`&R%J3}gM>W3AC=CF`U@L0PbSA9sq|AaC(f~PI?eYg39A$cFq zl${|Y&gKj8`EiZalz}QO6Oep**iIDHs^J{7Hort3>eg|gdPn>UFayIF4GKqjwFUby zjtpTD7sgheI4TJmLb%SbeS>-W7%4Lyp`@)3XZk}e=U+R={!n+U5cCoDNv25tZUXi= zu7sJYjEQ#Q#Cblnxiw{FAG!wg7NCeh@JT!)OePj_CCz#RZ(6w}yNxmXtyr6P@F0~= z8%!5fV^&()Bm`t!(q$ZeBWGA}%!&uOLp6E9&X9V8U~?w4FOc@h3>+y9R`lmD`-815 zQ)wF46z|`!L_%TsV=5g+lB8;rEX~Wl+5Ql!) zy5dchsl6G~*X;?mztc&273D%UwPRH)G%ATuBHu&34oPa(+iq&iyH^%4mgZL_T3liE zUBq}{T2QSF<$5zNDT11pNP4i0MP;yHzm1tC`wHY|vnJzo4eJN7;{A%oSwuoJ)&1)* z_C~QNZ1t&Q54M)OPWC{4y0G2aaa_NQ0dyc>6MbY%E^3-B9iK;C-8IMzsL!{HpaB3N z-lAJ0M^Qe!R-~>|XbKhHK;q&A$aY5-B|0i?{cTE8R!!9^+t1ZVG`rLwD!Lgw1=cY%QF*vNvEAyJ*$6m7(0zk7y~kd^|u6{RJirX9^&=~Q?#vctg)WW zlCYeS3c@wjTGp|gHry(Jp;9(xBgT*1_kmh;1o4rifJeF?8 zL|ap+!6RMCK5 zhMz?@I4!wU7V`GPO8|ardxyvq6!>GtROIL073kL^{3W+p9OFpwOIN}6nFDNAmypAk z*zy=|Uw+aV@_gz<3N}+SZ{w_-Y`q?tgtYZY`SpPV!?RIw-{GF@uflda4ILqL)Qu9G(tDoe1`sBNJvwi5pWxdjzB*vS|hzt%GM01o&*Mc9Y8TrHSa1%0=$MIB2+h&<3opL zeDk0b>j1Hsatma)8Fw0Nbq8--9wMqJwRGTP#F6DkqWHqoy-1}*5g5XqAJ*dxPK_$e zI(!?VTjf@4>9r**W|aam6H zAYaK6q!3iUIj_TBa>d<6To0YRQQ{874LS5TGtpZ|mqC+zbI78XkGW}O z^aE6=>&Fv#BrCzP0#Xlfzfvoli$>#Y2r$F!g9efL^LDtkSm$m9m?af}ZwbKocRA!M z9agdI34k~nm|j9Eeoc*SrH_r;Bf+r>KW^wtcuB~SyUmPT!Q?+ZT0nUEiOj=w!cxTR z8K#}D1<2cpTkM*9#PnpboNWol_15_S$mEYRyFV;wRBpy0}5p=BrzDh0L^|;{S>{uicB(@|(Kf7D@(8*0!1uHT*uYR zjHxUAGjKrpPGJgD5+pBr+U~OkD+9f_Voqy*yPxLc*Zr0j`XJclagFs(%DI29+&AP9 zZjxpOjK>dlji;3D*C~&NKj)QXhL4!&ghZ#TRNNU@X$J%NUs>}#sXq2dU#6fS|7Z&O z_X%MCMZEv8zErnVM^?x1qYIWn0uxn9lCoB<5a?-DsTQaU%Twq9jgV$1AB8APl$0^6 zTA93fHFDQp_mY!eg!i$Swyaxl_Ig`#ekrudhL z05xEy6IY1+U{KqU1O-M+D(psb#i$xUco^UL5g3#Vv7(?`PuHn zG4Y7Y!zPwBoAB`osHEv`@gU7;*qzu)-t&wBRQ>h$XOOfz?bHa=uz!MK@&*tzRDK9d zrNU$_Oj$4vvrViBio3g%o1ohmL#=4J$+R3QdoL?P2Qz8DN5#82F=3n8!k)6}U(hvg z)d|F!T#aFh1k?y!AqAMppOknJ=abA5a`W1l!&=K2Xc{Mm+E^`VOe89~dhX#Ie>_R@ z8akH-CT?t8YCy)eo@}|eQP{$Ak|8g;kn9|CiLI@n`Lrg?H5d*#2-mHq^TfiGX4?o| zvYKR9b;=6bB*{T8;5yN)OB@%9O&Q3#YO1X*kvPc(jPhL64Y5)SM%jvjM{)zwlakr! zumw_+&p6L5%r1T$M`5Z3byw?(0xMDB4G7Ehtk#a&!em21TYk}bX}oGYF!E1VLCgHU zUQAH>GLA@HDl!MT-bgCF1bF&ARnSA#PQWs1Xa26NZc#F7kExV z`x_M6rXvQqb7w5RHQD6??2<1&oDFSeT}f@D46w)Mw&-ESIJFz0eM}F~Dd^QHr=wP! zdW}HZW%b(+YN|7?7An$Yl#5P$j(UZ5+6*oq2M87vATe`GCQ6jvpk^3Sh zww*vt-ef*u#W)$a^fNYBcOgEqWG2i_qP^uR+@Away&ky|fBOoWu-r>$n zbcvQ80FwKR^=6Y8J(wLnVI=C$!C&`zY>3OI&<5-8ART{Nu0XeB2Dhl6vQ&pB9Qo-$ zQ_xVNs7ZQKpQr-qubObekgy&x9V)Bk2V0)xuv$re>l*=~ZV`hwR;A3Pr#aK1RPD4l z@pjK^PTz=acV@_&YJ?Ij!+Hdt-X{%kraH#3=!aUwe8kl2KdZ#R;-EW%X(1Yj!x96; z_!hm^EQFZ1Yk2M~dOK3yI$S-+@#H2NsF|`*$9`@KJkOp&z=)M95;81sMd$U1>TC-k zwuUQc=M~d2MA!DP5SjidDDbI&W>1ndEJmp?UHAzhBPE#JgRilmrl`&sJs3Fl%SrY8 zJE-VEU)tMOUu_BtwOS+CgjA1yNWiu{^bPjutv~zRAHVu zbCV{KXMa4q#IV;#O~W|2E$SvrJJYqcrm{DVk6ZrSuiw0!FFY2^2x8i+#xT8zQy^xY z+UEfjHMAORpvFn5mCLF%d+$-yJ`x^zj!xj(OVxk*emoa|BIV?H!5jY?Z<*UW)M(}O zLUvX5FsO&P+2M@a@r*P4O-TqnDZh@#MMvn)CjN7enV!5r-Q=mjzXM+RiEQlmH1n#^ zc%@D^UHe#oWNI<~vvCTf&&h7X)En{g>wroFP1jF7-V4W@en)%lZ`Qgu)E+lnRgeJ8 z14S3dnnNphf(eG)zOH-2&OrFhN4)3FmAxrm8PMrRzJFU)uMkXwGkiJgD#HKMIKcL| zD{Vuw0cPY!|xTP;kW7b-$c=9Vy62~paJ zD#V~Xz(~-h(#O$Nr$B%y|fKZNvCPmdGGy9Ulcs8?5UXtJQmT^8$=V(@}9 zm>u?0T5p-7Y6Vm(p<0|!ab&0z$}gv923(w?+n6%Q^5%?nn4mUmbrSU)YK$BgS4!^X zd^NP_1Z#YX4!U`rvG&~$r=}*F71-p___}~9TH9n}iGhy2)D?4xpNr!nc0~r#b?1u_ zeVcotp(KSNUg6xY8%_6o2msYZI|iCA5P#)43u;9^V|TR3@Y^4u;H7!vyoIKZ4?eM; z?lF2?C0qhxZ5RCv8)uD6aD^kejc!)&GHH@LB~=s`YQaVtNB3;P_|K9Mju|Wqc@>vb z%PFXUYmb7fDF5+!xYT49WvL4FUE8_WLGyy5qmlsCcAx1)(&%vmTPey7)=+k=zR&gLuE|lW%6JXgX7UYKtJU6ik~S;t9A_Wrx!YV6<7GGF{cmgSng=t;mQ>!w$_w7 zh8S09#ZD{2SXkg(jn+tveiQSzOADTNo~U)%sc1GjN9fGf(olI!jlMpbEz`71+5xn! z0T@-KpYMHfum0tRX{V4q0s$}kNINANv8OeeMJdnd{$V3bsvoB9>4weN=vvb}=~&y~ z;6f>*&rgG99V`BVAI!KfrM6G_FXebdqK(1bq|CShS4rn9Ck(Wd_MIy__SgLdGvP%- zTS79QAeYMH?sLpnn7oK6E}yCf7~GFtPeMQ|gL)wFS8aF@rnOiKcMZ*!JA_}J7qR!8 zztoqf+z;T~J!L6&n)i|I=keWw{bug^XL%2%1t5$u^6oimX1oGPL^Fh0#1qI3M!(qX zU8aLiW{yLK89^KaGEHKabxoF~$r1G@@JB^BpX-H9yDQsL{TtYhLMEtNE|^>4s6K)e zuQ-0cbFeUnmF6-}KnPpqY|0|V77_e6$N23I*Dx5Cpu+BCHZ@IK6m<><9B*HWd*%C>O_ zpc2duA;*1CeaWTUmLuAu3y^MI;{LxCneK^S`o+un-zOO#l<(fR?Oi1F4OSjcq4ha^ z{tO>jzrc8r*PZVv>w+eg2K9)P!*oSWsbn%fpIF{z(0xM~=hG>57yy@{sy>wf$QC(* zLo+f%xItY$-{Kqq>)U_(_d6P#5l$Y&*Mgbq9~aDj-wI3GIlCCz8Jqq?E3CHege{7| zOFXV6t;wB|&B4AGmxrNSyG#ffCjo&YP6k(ROf)zknTH{XY^hwS*|1hD)!oO<^ZdP{ z=RhfW3|rL)MReM#S_4Tz$zx{1Wm?8PcYd?s<@V=qy>G1%^u}p@QYeY7Sp6NXX#K7m z908A4T>yBaFauK{_C+6Q*j30s3vc;=PCzV1Bbj?8><$ABTCqd4)H*8aPc>`oUVvh) zh_Zxx1F;!q0citW+bL(Dp?jHhTXB~$>ud$rL5}s>oWr_zAH}@GVKP%DIe&Z>r7Zh& zoD>|omQ^TWr`a+^O`@oB1no~vM7eZznz;#-FJmmXR%0qo1;8d?)oA1`@*Q^7sjUhM zb(8wd`B#bseQh&SXSzVh%R z>b{(AYea5?`X0;EY}pgsMPL=V!`hV#E!azb57MdyNa`{_fQrZ>SdTi zJdZinOrv3&^rTT$O50TGaa!1x@WDWvvPc;A7obXy5>@7l8#UqN&5A12u7}pewdT%t zO61oacL{IH>HQ(~pX_Wy zxob3}1uS889N~}8__11+gzvDqj5^-1U1etp6&|Ipr-4?HQj7HDfYltJyJQuAcnqgP z*N8sNMo-y=1+adTT%7t`#wt>9pJK6d3BUlun`^E~AI6Tix6o49^B;o-*av+Drq!-n z@y!qXLuTTla6?a)Kf%IJkCZihbN@>2ww0)0(mSqV_v|22SylXqWT)U$oES=)%(>Wle?2rX9vgHLZ^U!AH|pRcu*Nv(mAULL2|D#XOL1W zmrOR~0AaH3j!=W^mRX2Dfd#;cRcZmYC59m>65ofJaKKgSh<5nRf3eQ5%luNv-M-}1 zGv}-`Af$&L{%vTUpD>BDXN4Z(GvXTIq2q$s1(hMDE!ur^$Pv;0q4n#d;+M2;ORA-) zJw)`_Iq@7tJKVOzaotx>UgB0&>bWjMKLZw zN#fNR>=GmmcKcs$=LRxZoR?p#XwQGV4f^}5XGv!{Lt9gmzwKV^k;T7)CG9)w90`MC zfk34Kt#LXG*Mp~5FobpmDi9FD0~cEAc9M8 zgiCljCJku4aeEz1bgAkPAGG^^@6x97D4*(OcC2rtn&oiNZYF*gw$z0@Zv@k7?2|L! zzH76448E)a#qOl%g5R}_-uXi@vVDxF;HnRCUtO&gWN;RP?ukK`E3x^78fkgQWgAn9 zDoWBf(^T*P0=s)BsCMGOX8J+|av=Nm0{SGnl6$p%2Z|5A*FbwuMeHs~i}MKfo3 zu*Urxth{Y7-RLRc;9&YxJ2Dd7Z1YJ_r0osQ*f2iAB7xK3LEmXOe|gUlGw`_2VIc;L#}`j z;4o1uawt)FAXE!Wet_ouqgPpMe|7LS+dM2*G25|qZ+q}XS7 zSmN=HT);fOs8cLm$}fr8f}k3U?~2R)1+|HR9!_e$_VIRV9Q~oiJxIOA24P+rkJ~B*n^tnvN|MOkKy3~RPFwepz+-P*s zf_#x)K5@DrSWI}3PM>CO^fZcU4`4Edvtd1;2$;8ZREdRjDU6{h{e8O zn*WdD1lGSDIAjc6Ozm9$7fMO~K7+GKP5Uq5(FYb7ARCwNdtgGagZ79X0WyrBsX7WI zKQcBzd?bk}vmqw$N|Qk`3!{)KwLUI`}A`cTfG?(`C7N=6BDc~xMd+MVn|4Pk2pIweR#;huEr-!ZM9?i@MAO2bb(rNN>!dCc%kQ zZI~e!jw>Kv%r7|zIR?6V*Zd8FX(Bif4rnSbB+{u?Z@`OSE9<*Z`v#4z<6a2t>QZ+7 zb5dtFzP%FNk=zy=TySBAwBnpdnOzRleE4!+b%s|t;qImxFJHgPNcM>$C)0pCr zEtk}3Q_{SUV@!3fnFckZX`21yha?#9M{c10UQ_a_UX@woXf^M-oSpu3$8m8(fx;G; zSn_$j`Qg2`*!{{feH#@FGmO1wignVRZa?Eu6s@+}>V9B1v2k|2{UVhUwfq`;hJ$mC zAzI`524w_OgAJ-$_e1OP2J0{0{s>U3#t!_-5hGzy{-Hs0Wl?x9)34VD^xTmZrMhTb z%-o8VL0;6yYs`KV2y|5$qLSV3cuG@^8faw(?4hbdhcFGa#egVrnB`Al6}j#A`dXXy zPNAlzMD7BinbpEwXR~=^bNaN0Rtk7!LyE*_H#^m`AH)5ortjA$mLetnR;}%mn@o%0 z`5wG=O#*UK@8-oxGNKnYC%;?y9>HDqH9ick1|)v<^X&ok|2lAf%)nY|*RNxMQqk2~ zF<2Ab#AnKi{TwGtm~N2e5enKg$nCHg?Xq?my=vrdAK0&t8g95Z0B2q^% z1a^79s#UAh_KZaT#{Swy8`cHLeHjR7>-4A_coQ`JY+bw$+%ZNrOlHGy9A;NPhHE>9 z9$`JjB#d;qF@-IMSR*Vp|NHylL<80^p<#$D(l7?u3d+F>%fTvYt~C-;{(}+J`~q#%fhfZh19&j*9x^Ttx-Bx@2Mk`4x%mZJ#~uR~R<#oZ*SP zOCvs6tb)YsYY;!dr_#?nCFfxJZgisK8FHnPR2(x8AzZTh$gaKY=Ai#+*YclI-{0p*{zZN3VkjR=5W%L7kR**ovaKLx^avq<8MF=(6p0@h(hQ`Q zb48l#RA|YjRHNxHb^L|C_OE@y+=&S@p>kVHiJvpwa}QNCQMMVFZOpjQjUDEXS(n`A z(|G5n-F~0IJuGl26T85mRD3EkA+dc6naXh@RDrRK_`R|lNV%YxxgrQdMj(tdqZ%oW znfVPPn>vCmxPYxYKL4?%dh0Z;HHQrnVGiRn%?;Xhu700+7pnMX7xi&99bWCJL+T8B zNoi;GmW}%p3f87X$*KANnRq6e{%rFwQG75(*&#Q~qCusc9`89ov3*jc=H}LpW+I92 zu~JNC#|GQL3c8eCFM&LfG@wDh*{Mdc9%DgueC}K{kvm2%abB=?_=E<*bya_W0WpfJ zUx2uKtQT^4Rqa|?4+N78Sn&0``Anebsy@BZCcf>|H$q*Dl;+m!K7h@s+^CP#*6&z0 z%0pLjb8PTF#mQm{OClBN(ms|)4Qk{^vWp#>^ z7QvLUbt&eOlnkbs)>khj82eeez3gFI%H+Ig!`RkTYHRj*pOu-#PYv~_+FoTeY0OQo z+g2sk_dTJqkD-6tZPh8dpv#&AEV~YLoT^Rd%H5<&@qtzw)NWtmRSem#*(S}?HiR2g z(G0EX?S|ddj!WCjbGmlOhjndJUbU#MrU0IJw;{g(o0o}A)n=zA$`%##Y~)F1knWQ9%BFfCqgo^$4?rX6}F!Ww&&Y1 zWe6@0WlveFcPp#-GTJIhq1OaSqn#$nG(b5qVAA6+w~Lz)vZad-u9+RAR4Bl+US^eD zSxGNbQk0oc8>=(juDmz!Ae8nFA79ir3`3aj^z(V+S3aQWVo3u5w1SS-hT**60v3}_ zhgVw_1&@Z`(ReXx;?FmIhpV<3Kd~;pZ3i1y8sJ*m2xF zgwM;^(r=auafG`0h}Zj_NW(g(T00A~&KSlHg~6xa6DB`7Hx43q3vvyfm7tx$ku(P~XjlJ5eG!*4 z#sA_-XVwkH6Gg}y$K3dHH!E}fJYU`qm^nr+47QROLS~;>!xI;#P7x2e44fpSVFe)$ zF_Pf>+|Li^n^dgf?}j0^NW-*I^&M$u>uH9VvDP?W)MtQ${4eU$>mz`Hnk&BGIh4Mar?W; zty)di9$6B>H+v<01t#WM&+U2W$KH3aKC@>D2yC285E+3VPAl`x=VW#mkG0Ia63>|4 zoBe&Jocn=|*dX8ou;KV2&F#Fw14u|@BN^!zPWPwkKfjdd{lo0`-?PMtV-=H}9T>V` zHC1j#`kfuPdO7Pif14OPpeG?IvTi%l7y(uRNNe^r z7PB&I=cwJZyJ{r47MN6@`6zrQGy$nln zQZ!_nC1H41W&$bM(Y1p?q_f-lPX2}p-B;orK_7OBlwzvl@e&;rhgng$bzPl4Q*?EQA3Ga)y{%8*U(0=(-}o3O zY-kZ-mYX$P;3yam!D9w`S^CohMz~wY9Conhh8T3%s`E$oJ^*U8vHr1mWM?%n!`(vQ zfVt)1$!%B!D$7-L@d8tV`-qKt@t;zR|S@j$ghhc+w?WfW_0mhl9*L1NS>K2H$6f!u)#uiC%R8*GA znk-{P!Xa#8DMXVe7zOxoKRdtHSf7SRq?3T!pbJo#`FHype=+M^WT4uX!)V}o})O%u|AgegUJ;0SZp(*uhc7F-G z!4khK_-j!t$2e1>FrNo?!U#kkVg49Ly+o~f4>`NC8uSjZF7fF3^ z^s1_E*oWIF7&i>&F}|k6rW9<5UG0z{qCC~~GX9|{zJKUGS7*)FYzkgEec$)EW2@d#^wz(F$}xU=z2RIqz9Z$EeP~_|0|C3ur>PBKPCz-+DuU{ zr;&ty(sUFxzNxKUZ}K|g@UHKxP{sr2hS%Ty`)oriL0`R&11L`Wq`HPI?6;6wPP(+w znCmr>s>4EI;Q_SlzQv}p6VmcZ(J~aO%Nr}+Xf`iL^A%&N=~ePB3>41^oqD@^i%HwT z6*Bw}ZF`#zZ=mIK`I>~`C}If`MsbD(rxnufEQSeMudM+*y$(gzEC3br3(SX_Z$o{O zfW%*}wE*oZ-BUC1#BodHt-rVdLAI_5*; z<1_5VO~y>0t)<5q83**AkQ&z#bITMliLd=&-uIpRS$K&*e1ZEn_%n|&YQ7i+uUJ^M zJ<9bS0FE4E-fA{BcVl2l2$G<&qZY`_+^Vlsx%&2z7|y%*;sip@fQgu-kNZ|o7GX%4yx*SgcR`#9P#{Bdcbx_^ev8bc!g zjH0T?_@-Yn&Ljg(!jL${0Nx*L`2>SFvw%cb45)1D@p;gjXA&|5;uN7IWUMNQ19ym< zLoNluAIf=m#3{aKOzS4EJi>z?z3iFV=8V!cobe9G{R_LZ+9Q&3U)Y`hN9;=c=k;0E z)WyQyMCCs!(7Mj^Vko?sD~dM3duS92U04p~#;7WN>~Q&VMu`gKrawl3<*TZ*HB|Hh z8pmWlpf2wy=_h6w_5*gJ1Mt7`+?Tp|xmN=QV3?l`SQ6aS-KV#lFSa_o9xun$zfI+* z4>OE$YGAAf(NKB*+0l67lqWW)$!gkWLNW4}bV?T4)q4t!L-Wh8>&P6!IOC)gWx>7T zKx6E8QHI)YR!g!V&1u>7BC-?zAl?t1JBM0?pApXtP&jyd?`RCM+D@_rXznMYK2itH#n_!>YNqoSt zmZsCQW(^mSapJCR<=odHQwOqKsbS76O9>y!vAJ``1%vJ~*v0jX@3_RHkp!hbB%6Q% zhk_md#`FSAhpw%=1uvqRskO~jlvc+8qbqr&Ij2v7L=QS&M*?V$LE;Wg<0BC7UciMN z;)Y+W9N*B0yh}de@wvkgsY$f|a?rK#&774M(C>~^{#K)LXPgV9o5-Z1GhJ$+Ux2V+ z8amE4*|l;gOnnVJoxSfUep#4tcM^+?H_#GfGMZZKqO~aYJ=OM4?eY++PLm_7IOb4` z{O}MVj#=8;`;bxEhAs<+RmYS7^y0M13KS+ZGK_iies{;KP$Fp)d=a8B<-(5g87YWXCP9KHl zO-l6#Rdo3)%&SDcJeyfuf+5tr=K_OpN%jJM;Z0UFn4Q&`rtifBQ`SaSYK!N9q#B~F zghJHZEQ?GidU5jgKa3`*JYobVwH68`?#y+Ql_F4cQ;GxlF zp78Eao(=g=B=95Otg>v3F~uJ-d!aIL{JTVQxl5nuuaX$p!!Xl|SuB^z6va{gKp((= zA^rINvDo?x=}G^HbdLWgr2mgHE%{ZZQ9ep!cgaAov>vKy@=di0Au){DuL#@^X){y@;uX&r#~Q~RXTHL;*Xk^!nmv|qDD;4kcLi6Y2(3~bcgObL6#Xg@3Xli9vCeg%<}-L)NfH38CW(g5x>(+RziUXjhvmh`gA-liIGy$UxQ7Zc$M+mvx zcfRoce#fYpCzv~VX?)(j{Oeao0uT5dgQGjdZSudstEWL1_E(uc{zvc%{^#ITGBvh$ zG7+}7b+EVldRF;Yz5X94)|N*WMEL;IN=c!j*s`ZkI~UctY#|B*MWM9{M%YW7cbki` zGk0`fD*8(J`h6b`E{hTkKg5pw8S`Rd#M4l%WfcW##Kz5S?l$G#<-EQs|NHkZa0j3U z$2$WK00rC-qA*j8Fo(@fSV&R`i?B)ud`Nv<@o{H56Ny<8lHS%%7rhT4JP>J(ZmEd^ zY~N{<4!Zl#s3@(j>FG;B?PXZPY4WX|?X0TM@#yc%L_(vOd~+45@~`Ev@~N0KJ%h-N zohHK_dJz(Pkd~syZRgR<*g>H7?iA2tQG8}3qHgk^kq66VYhimYpYmvx=u;(C54Qm8 zHJ0_b1b;>HM;iI3n%gv)&G%COTb4$SWa-brha_UF?&!pLzh6p;J5N@&i~|QIqK>#8 z1NWo;yIfrL4>*TIVMTO2+p%ru4ytwbsQ6(CQ?3blv#uG@(`^CjNb~iI64f(bi!VU7 zJJ45?O(UVNWGefmi?O@&g(g-3Q~qkQ!yBg?6)C~yDA$);^;tu>^T(89fi9j}vh#>k z>&sK54S-`vXCg&_*kZIf;(H{s3`eR9c`(7&3P&Akfd!z=F^85{tI?(yv$TX6Fxr(% z=Bp!S*gd2F(3ZPM>rPn8S3sGbE0B{)ZsMy3D>XX=bAi|BNUjPUzgIkV`<gVm@Jt-3X7WY0scyPlb>U0KLXlKXE#Vc zvv&DKQVtEwVkg2Loh!Kqo&FXfOJZw%M%G9xz`k`KOvH%mb0y2Xb%d91Pluw+cKIuKo;!(*A6Iru8Hv}ks z+)sd|F~i>~g-DvvA;4}tu2TfrjA+%xKa2r3R}d&eZ|FWC-zw-X`W1E(A|42Ej42F8 zb|=gc@g8c-5pv71Y3#>B12g9pbZ2)4nd@Em^Z4xh_P-tjGAGALmA{~z{f|)Q|IeYU zY-(dBVrpz-==8M;`&ak<-+`>Et^8LxP63-+g3!nh3tX?@*VeuK(=2YsQ~4w;?ZS;gP?V5?R@$R;wzb91J9^*zkuC4c_dyJi0tGy+Pn zqlA#kNK&Xh?v_(rf=qW2Q&@frXs_74-tr)4cEsqc>@02`p!1eSel87WJU}cIT`Q1%)9=-y80)K;ua zRgTRr2z!&Nt2n$;(obyJVd#AEoNc6A@jd6;)^u6_i|0e_dc4`o{ei%^y|S}c&f zU&?0?;e0@Au@PvbZJ6J21{rTI2#;CLcOh#6eMRQMd@d!7j*6QG8_NIq~GwnT++-!8NmCEi-Tg`~aSf{#;YW7HajGJ&uL z0(V&Nhf0(s$hp5kv?n6QpYkl7LRLnp!+N2S?BmAqhks^;d#LX3j_JW3*|nu!ibEHM z^V=wW1Xrol!BzK2q>kcvfoK?W4S0KXtW%48Rgu1i@d>zNLAiV8+v&kVk>{e2%vo4_ zOBVS}mGq`;iCX>4TAMrxrQU#B;2VsvIGLpaxo4qB5=B@?A|F1>2 z|D#oy;TNno{t?zp{~@gZYqkA9ki7X-k`X>>Z8^(S5l{x{MG#*DaKg%Fq=Zlk>-<0< z82K|r*D2)f|#2<`n|o~ zp!V?C6~_;R2$DF=_9cZ#qm^J*fh{MuUtyGtOIfU2TJC@>T8+n`pRua51kb?}H;pi~ z5?V)`_8`MB>jp@vv$01|gPhY#lHNlJ)2-ub+eH$3c4(4TP zg>-0dB#OmGOX{Zb_4l-2WnMIwF_~OYlXkAtJ^Bh#H~1UUIlpImSi#E)#^M%P{#q;4 zIvQ1`oC?_7oZZVx2hq^`6S!kZ-c0otL9TDPs?uCCVuQSu{d>r$X1xOLI7kA}rq_m% z^I7_|2HU8&ra{;JXMMx1tztDcJGG!7lG;C`opMr7bPjv6r!uUA$*SUA+br4`aD6Xe zxr(4Ym#XrjTAY!Q`Q!_&Ni~yE;jBt{X9WHeS)#@2_nzM-%XLLX%`dptQ+~&w3>9U@ zsx(2YHkcQ~+31tvQVamM{FFl-G(6hPLiZ;EwJ?#jSN#ld%Ed1TRlwdVzjU(qkV7%C zeZbc#(bw}`&3Lwi--tFG@3$IhQtUEF+${^htc_jn^o#^#c8Kj(M;i=O8snTQ(Bj@x zpYVqKyfTM)^zZM@4#Yv$8ZvuiDKJjqJAJ(`{5yE|5VW1X(LW@eQbB|xx)7D6Gr*7b z&-)E5@@9E$u~dsCQadC=#uYNH^r*_BAf+Q>kTH-E zD9yd=&wboQ3EUx<5~OZ79clD4k8CPo?N_jn8E$n~Lum=zgsS0uC;lg(NNMHYqK8gF zo>?Xe{~W#0rG%27JR|7&AQC2WNbNz`X7-q7<+6RYq5vr272`@B$+D(*b$m7?x6%J< zfQfI~10KGV%NYN7Jw*AR!Rx=HDq&r2T>t^_ncssnr2rS=1b~iP({cb8D^n68Daw-? zK-VGUeE0@8W!Jbxu)pZl3w)PPMHWnvMfF_L{Kx+AYP#yr=k)L2@ZTQliffB%tFDq6 z)THXYq{ZnNGZ_3zSl5lP%rMQNsFmokHY=&CkkH15^c+lVbXcNGW~+1!E;J&ngC!|* z8ai07o$az22-}?cEa{sBG1|5#iXL&OZIBL%^T&=|!wXp&aooWXlFr=_>D;L^vem7* zYnpaj&j+(a*(}}Y_S@VNe+lpv`_29KCbkHsYd1a3F4>5~&UF{gRVX84=W?N?wyyb@ z&)B;Z+|C`T-`v|SQ-Z$~riZzYs6YuKl`c zQLhd@ZfStjgWH*+*8Zc^$pF>Xe)7ese=k@6dwt5kJ0VdIV^fE}v?>2|G5%lrlvR?dxH+_{ z!2%3Rz9MbtFj7V-!o~%GIuV;$Ew<5g6Yfmp4fx@WC*jUzYC0FO{{Ky&BALkGiqtvs z%r|}8sc(M!$lv`5x$T=&nAW2NvZsL;6aha}8wiiO5o3fRZCEwNN1SPcfj`Puy1n;h z{3gjbn{6*&XKTTP0|T0%yTh$?=&->QkC{ctnCIEmiq8l%$~MNxGp9Ztu~Dp8b9X5jPtWHmv}h~55(Nc^a8BnWAKX?yPlm% z0yqk)cuU2Gp#~Q`P(Q?~6b0l7iO!1U8D|P%1xzZ^Xdm;twl1@);^JDR%bin!^}XOR zCOx-{vS1F~Z+B76U8Vsx>?JwjvsSW@fiKrAzg*gynjCQxyF7{k`O&@ih0>j<3s#-V z33k|Y)P|pMpRktr{mG#<4pCgc*=>T5EM>z0h2w?IfgLEFon^-bG796qFH$vzYK`9Q zx{0IRWK_@gI-8B|vMp9&t^TxyMp%z30}g_NXcyE^Dx%*d0mpu&zvDe_eqrpDTAc?+ z*q)6XdqH#>eRl$IdPtso{;w63uP~_zWQ&McP$L<(S z6YtX^^$_#K>_X#=02KOI^$XA!X;I~`nn*mT9&?!{?$usu?2c9FHcqHKD-s;rzt5yf zFI6oAf0rQ?*|Y4F+oNt&D&Q0FWpM>ck@^Jm(6eCoVlTuf!;>J0AR!hxB%3Lp&!_cf z{$RH%)IVL#JU^3lP5VuRQ=yytICB_X>?ca_jzbJHjR>>d+E3>S#NMG{jJt%fCD<9t zx@4H_ed(rgXenY3+mvvRSS_)T&d>1j1d=aV98#+?BV@uPwTCw3ccEN+Myas==mWa! zr548CEZ9uyo6>2oO_J>Qy(wh*CAxhL6q6Ge^IF!Bsm{lJf7BD{#*NB1aN57;XvC4~ z9a$`B__(`M5?a6H__2^Zp3XPGak}PbXMeBpG&|`F<=r>q>HgBr8`9~gm~cfboFOx7 z+uWnjb8A7J61SL_NR8p*I2izHQF(6OtamTO`|QR*^>f(e9q7iDS9ITUvnS%yzba6d z@H`pG*AZ9ZKWbMP|F#1Cn~>z)Or4x8P5#COw_5$w9eWY+Q&;;zYmUqjXP2d1l7LY# zWw#9Sd!VgO)&QK`n?zlmWFD>hTvL;vR{A2<;QnIDW99y=`W$*AsFuTcVegOwT&X?> zZ|Qp<`v>;X#OA#iJQhi*xVZP>7B@F@cX}JM`{(Hq8R1{t=NxOdmUh1=!7|!w>Q6JMk$mg5X875U{I8u5hsYT2hlXZrfxijdVFc< z&;{|>Zcz#}dfvgZAlwW}U`6qC{gT!kVutZ+pTJ>gu%7aN#HZSERpJEvGH!NCEEiQT zmP(&6n)@vQcc`MbdeO>$jt(KOdE4wF9m8~mAjwfr}h zq6lT~*GZ?$zD2QdRa{CN=CKCPBf7BN5)sRyS6FPdMtWchiGy=fpOd7gZH2vKdgDh9GZ40JwNVVPur<)=i;b3d zK;em$xn3Jk=#p`;0Ex2Jh^FPS6P6toH}&+W$!L?)DCPc~8#AY>L79_pp5V0SF*>m# z%o@K~k)4@t40VI)1XcUHDqBNDS);hEI;S(!<9jj zrTpiJ{(iYk?cD3=)v*Y+!^&ca#1WTZ5foaaHW_N$(n&LXRRI={oh`BuuH1q?aN8->Xmxb67l6iqmq?~ zkn?@QgLY@T;7*%JlerymWuq6AA*_Wx8|OM7DUGumb3vD=13mfxjB z{;~+5I)n{b8L;KB+tuWmUWf}omw7|sXTB;3Pj#3Z821?LnU;M6>Snp7e$)DjA$53i zQBbzvNg|utV+ZrI-gUR>y}Sko{#oxy4%)1GxQ6&Z>i#^bHVdyTwn{8Vh|heD^)V95 z4;hAsT*zU#E4HBmyi*@7WpFiyG~Sa7YNw_DSOIysOu>HD-UE9&!ghkoc#(L%kR4O* zB3Ey}N)Z6;(uaNSY>T$&e2g~Yoox*&WPVxJEysh~ROw<-U(b<`=g`Ef;w#jgqoRh{ zodaP*U>&q17~_}NvusXFZtftOx1^`Ja7;xJ*&jnQry8f!st2CregcasnzKD317HBZ zP{pKQFZ)AEPu+bW6MuDjA_?_nSQf#YvZvJAO%A-g zT@ah6ixxEg;IhLfI%!~h-{r_!TflSCM>5cN~L85`w(i|+FnIz?V4h@;x~D^ z(!4O5D^a3R#^a?!SB|iD=J)TqK`mMn1luZk5j|A#zksy)|5$s=s5rE4OO)VJ1P|`+ z?iSqL-QC?C3U>$&A-KD{6EwI6cPBt_=*szS-+ukwKIgtSUjL{us{Ynkd+s^cUTe-W zDt_-o?VHW3d)O~m9|a$TQ|_2g+u5ym{9ZyZboXAP!8>Sc;7bZgsqa!$+%0;WZtvQ| z1**!V9p_4%7$-B4C2(ip&PdzS)RoydX0Re_J`bW1em&;TWH%Ay=bVKlL+NihN`3@W z`dl(1M+*Zc=QWF@e)bdjYzSg9T=L_cjKO7q<)ZNJ(TJr$SMU!{V+?xm3d^FWA06-_ ziklbY-{iLPVDH0rBG2UYbR4O9i&vb&k2RID1|yy{MUdV6>0DSU>Q`VA=Pf z+-_q*JL0ui!#XMBi(oq8QAEkY_Qs%k5Mr+biErm{gh1Z{d(JAZ@iA zE3^<0ZXJ?kou{w2L?OD?i`X`bvyY}ARTO#njMH$iT*=8bwnXD?82~vlw z96uuQI)S(BlJSombLJBheCx_V-z9}iY@>jPNEQ$+j!V+XWE(Qf8t;{dHq5Z$+QKQ+ zLpqCq_Q@t=URJOg_BMyJ?dT0(?u?3~5N4z0&^N;{A41s5(DwX3HCIcO7j> z0=H@CVQb;h$b6(=W9*ZO`T)Ro;gsJdSpN{oOP#o6oYi}`mmq+@wgUEG3+AgXu@PN$ zT;u5owRz$z>45@s>E;)MpYnC{>_~ff!FG$q-TjQj8+)k}cX^@Q>#zwicY?v-rY{O( zcGf>8u20Hfyf)ya{~D6p410+|EplCtf<>2<1rJL;O-Jw=2*(xONuI0Or-S)pwi8{U zv+ptaAuX3~_b245!4ev{Xr_ma?xoeikEGvA@UPV7-~kK2${-&pJRak$N}{fXo~tVl zllOhPmV}RHJ~b;N6Npx_$1u|wW)Jg=%7yl)_mie?;10WZid-JnVPL{WrfDRjD--mH z7~T0gQeGMS(G(LaTPivr0ZEDe|3_0O8aadZ#X!vTpESj}3hp02=}=u%`G`g+n>y8) zbj)pQov8n%DNbcp$awd7(h&78vbPJ~ftz<|g#Qv1{w~Dxe$sPT`0ug< zQNT5Tb`Ec9W-azXlroq2;|~QI83~@Aylfa28>=;}ZHg zXaP^a!jpIKCse+D*U1~TMe(`(Rp5okQS+`9Fb8yBkK5}*z^Ga6AU|7=*Y#9jZ8F2`T| z!nMAEIb{|83}u8xF#<;=B}^=yJsf9}<(#+e%cABx7O({z+V9@BIX((A4gc-`SXRpA zsv;7^u<2qZw#_oQg!@}v#J=s*{)n?$-&;B@JtLB(MR!dlnfwD<*BRw;>^Ylm2g#zG z8aZnXLpanv$-odywd+LtGJ6&U#$r?oVmNJZF_1T9D7ex|i@0=%;CT#WV;|emsiiVm zOHvVbsb|mLLhrGe61fF(mPWrgiP)9H$89aycEJ}b#47gQ_1D=hvmjI6l{2$Y9-(NS zcgzbaa`g=)%V1V?b?c1Q0#;a@V*_7K%|NDG1CxC?kw$N_dpO;OtpcCFl!_(kk1H2Y z>!^+wL!bKtMFrJc1o7rMjQkymOjBRva_vXv@Nrb7n-5>43f`t4!x|n36Szg#z9VhZ zf3MEnYKybVn93(EWAI$bbNDq-uNWrG{|k)z4xeGBVD>Z~T3R*~b=MCAd&-SpD>n&@ zU`GjHuw92E?T@hV;(%`EE;0hL5kcWodRD+P@5t)bd&K{#fXFJ&3HDT4_WO>EDO4)d zN+7Jo(m#>SEJ=jS6zq_ zVDwE}W9^o68qjmsW>1I4 zkQ%aEY%b&QhmL2#Qke{X!i-A7OfSe+nilq7zS2dkBM-kQV*rFjtUZQgt|^ZrI*nIu zKz~7>KfcmfH!n}aym&mnjQ{vbPcyso`IcAo?i~{`Inji4J;+YR!)@NwggFKcYb71l zM%@^x0c1uK@Jd#~^Qm4j^hTQ6ERk=$=sah?f||_+F#j6K0OMMaCIv}~rhk+ae?K_+ zFG=yg;nCkY^ZiG74+G>EL|W0+V6`XXShnw=-Uomi0|{mtjD*Z@ZuB z98MoJguzd`%Jhq)#zmqse2y-p-AoN%<$*z?Rv6X;WR_Sl@wJMZO}klcdY2&N2#$$U z$J5x~2B*8$w!qMfq{QQAg=5W`c1OQ87jSuPUpz50H7)x4Xy6&iD>LAbZUi+NaIES; zP}G8LJRS>gfyJo#ar5ew{NmGOk{m5snD|O#i`-JujU_XM^(Su6bAzj;wo-PQtYVwR zHX<^XB_HZdQ%Vv$(30O%_&7#%(Ddfr!O44N6S{mE8@Qu#!5YxL(t9gp##uPYVlHpi z25zp(xzDj}6XYhc$4^{Xnyg6rt&UuGyo@DVwn#+5ZmtYxn+Bgh)mq0-(Yt?q78c5@ z-FMStEGdS#Zq<Oiz9T?Z+PR_Ltw-jWp65^mG_R4J$C@92JNmg06Xn%>F?*_) z`8%i^-&RaLapt%nAPbORZAUiR7B@_zANjTwQzJY*NH#f4Lyaej77D7gz})2IH45? zdT22bYJLs7CqbBUuS9k*4)c|fpnDwUWG@g5UmUdgDW78%q8k6XJdsuwS{>w5Gnkyv z!us@q;5{(E?=|KP4QTxQ6m2*=sKN8<51>#6Ar`{RD%{7B-w<})#d*SJ1bL7T=o*RN z=MtIV;6tQ$bm`|qFGH7%xiBF6k>w4sDZ|xprbSBpv&GXu!RMzPQ5CE-7bdjJNJDu; zx<7DR@gDsVA8`M$sDf2@JV_90(f{K%8|#152>DOc`WwXRQeSgeQ^k9ePa2jwY0f|8 z83qqQStToG)$uTrgLSnVvkK+zt4BOF=#kE)?WYsYu!wXKj18#7a6imP&Ec*y| zsm@=_=%UZLp~k_@J&fBBaN_`F85e80pT_C5EPP*&;oTZCxZ&%~6ElHp~h!(}5$69xc z0<26pp49UK5>wrC3guD}s~y^_%I(z}%cWT7_TA-JJ=n&PcMVx~*buXX_&)>;s4Ssb z5VjjN6IM0&1bUjWl?oT_tUOHy>`9x2LR5s?cnN}Uems15*Z2}quj=5l4p@RAe?v^U zd@kTxfl1MiGiP@_^c)2W8^Wp_!IF!_21awA+l{bzh8R&K(+kdY&#J2IA}-_=Rh6(x zm|v>q9kGYYOSejeJ9KnXIAZU)O}W_&&D-jf%*$3cRZVhiy2_1l%web)VA9CQFn(*} zQe~Ti(Vh*NhxwklY~P_SXTU1jUm`zx7TvE7Z1B*#z@qmXsYRqoFq>M7qxfM5SAjl? z>R{a|&ZPk}sHQhiS<%AQK~3YGu_R;Ao@wQfVLz~Syrro>43K6?@{}6J5lC^A8Rj{_ zo&rE`75AcP{1jDb@UdoPvEL=VreUqEjA>ySarAOM9OH^#!u}*)?hoAQi5`s%r38~) zHq`X}AfeK3A-XN6IE0rel>1GUu-Jgy zw>=n8#m^&>Qwj{jH>sDyeK1%Ja)Yjdk>Tte5aAOlHB8G7#@X<55tpt{O8rj?vC<*Js@1C#nf{9;G;ZrG9 ze<@68Q$IqpxN%ljTqcnQ)&+ISpNUdhX29$oKsaMn7M-s6L(G>)=#^nO08i0zQibUG z5FG08$vlFyO}cp!hOVf$*;C%@V_S5jP=T@p(e4P*ZVx6 zuzTk*B&_H&>K>mE1_8CB#|>QAG=Y&qizR*s7t`sR$-`SoSJs`la0M?6NqML^DP0E~=fycAD09i6HNi!^LX9*6RlKHXEk%QMC)g7%E2)Lf@=seHGN`tD>f_gx&K`^kE z9g(UyAPn06N9Oe3VUV(!tDEybJ`MecjDuu=)A&oqsr`|0jbX-8qST>Z;L(YVbqvNR zR-~$3RtCm%SRZ!?cRXGPVRDqxPh#dArXD1?1$?-LodNP+3G1gX8ajFo?>o=;^8(%< z5PHL@Mwo+Fuz<{*koX=zrucZa^;i?I1|>SG3>6W9sQ6Uf`75dHxB!sz#Q;Ba)znXC zIWB<8sdB4$*>O~oMj2bI;Q*E9H-^HF8SMisV_tJL=Ovd=Ack-&W1-^&OGr0`RkQ82 zxCk4Tr$XT4@sGMF%M^T+6i4JL>)_I54X=) zGJekHCsgg$y!ETPJ=m#$R27q`SQbDX@Le_pNjOSe$BWP7MS05Fx)-WpKC274$XHL` z&4i^A6&;n9Hk|NP)Um4zXHTae@7HTvD{<)Q@w+llehAR;W16M?l?)V~OGm2<94tS# zU3H#oprZd$5_KEy>twV|LWb!hE&glSlg0LltKu4e&1KAZK{b`xNgQs1>JY2i&S#eW z)Og7@T~$g(d6hxq2odp~+678$w_cXZh1i*Vx{+oWVxzQd)*vah--Dn9N9T(MyBSOC zmpSG*7#>tlxe*)!>j&8po>{=|cEqNN=gCY2kHCVs^awP^!c|02ky~dt`aspqh}y_n zIw)IJBOGM-rp>};%e>yExt1;U8?cKbVA1Lq^rEO!s2ZaGZHfo(!vJ{GAQW#d@e0EI zZ;N0Y^MuPw1TEqkl@i=*R|n|SB!nD6`PO-i@@sggX&1S1*DPS+ z$yU*#ZwRN1a4N#xD97wcg-+oi*%?T}DWuHq20&mlc<`%tgCyLp6rRCO84fJDHUibt zqu$&#Vz(M}ZrQ5^Ao-_U&k(-+Bx!csMM*ApF)o;2zv}Z7>d^oew3R^Il9hif8+no+ z*=`1Dt?X})+gIrd|4yM@CMlvY*x3l;kkdvSo19_D4agTQgjeyUjmh5|nrpvwLPc`$ zmVY9gQLyynGd_dA0vM5x2ZYwzci?<~7_rYZXZG?+x@*ZbR+V>otf`k+iZdd`j-8my zQq4ySGGFb%h7_z4e~aoPHZE|=Bs4xsLk{823)*PMWNMu$BJPO9_(hMe3DR*xEGub0 zkesN`=I=g^E>n+cZo#XBVT4wE?o&zdU|k{gy(WczLSk9TV@Bp4eLH9Tc&+xuU+@v6 zr^Y0yPA`!{y~@=~1H#Yg({G*s}9X!Q5CX8+Q0Dh|&7 zX>Y>(ZzBq^G5qlTpOM9TW-N`-WzFn}BVuKyh~Pi0|nB2!aZ?h9SzUvUP#~;G7KuHYS!y4pG4t@%b8(OrqYI*nZFVsYwdIq**Sl_&q3(e3{p!oKrff!I4UjPmzO9-9CX_V9zs#t#i}T1GY(Yziy#K z-eR~UnC%?CVhrlGcme;@qvKe;zAQHt>_-M-ghILc5!;_5hzyUY^ z+YPfc75ghYUk)>MKD&$8vk%pEz}5)(v>06w(X!7#_ejWjPVC_=#BJACRnI$gBH`Xs zZIn-6qin(?15Y&>$TS>HNEVDvwTurbKf!KR!}@iSk-fpgRqjw+ra4w@ZJI-CE-tAa zw&|0##jhIm62!m46L@wgKmN6blI^S$o`&pi>!rP9| z)P#1ViMKXu@R1^5YSKdGDb8?FkpC(U_kA~-JHfkIv|tFqK*F&9RU9J@8@TaZAm57z zxGk(yl3$*h{iJ*c%UjE)={^OG&X-u_3kMobQ9^kLG#aRy2#NwoH5_0r<%WdxUtP#7X zwT!y+$sC;t)fUDeAsnOHX~12^nqr(GuCB*p)|iGzoA|M4Hh=Z>g#V4V%}8(#ODgAe zt#qjyISj3tHgad-orwuu$J~(gQRwkgWjy}j4-Gkb- zB{m;NI0oL>xbb)aRp0IXcd~e<2)=*6wKGZAuo^g;UlH1iF&kBT)$7bw%*f|(iY<{C zotfSm0ZeL51O+AEfAJ+ma=+(5TIQ@>11Nu85DDY}*IsI91QVOEAp1aINL-*hI2%ze zzgY0F;W5FqzE1k&8y@jazN0w|e|}h-xxEDY;oBX1s+GMdi2^8lV6?zVyH~{l6CvO) zcGuZvoX`fUk)!{+HNyHgHS!mN+(Lj5L?cpEIDZWsH5{ybJ{X<)oLmhl`{YbJa%Nb^ z3%~Fx3pA$WxCL`nfV?XQspcY8YwGjc>!9m8=6>mtQ1HW9zPdOHCv9uk8aOU^)_)*~ zVoi(Sm;#Gz;c*zgMbk06&Ya?IiXxw+iI}FnO+j3ENOe7BeHK&wqC9Cvw)9^J(%wDg zd0M!LQcnK|K}^3;i+ikzx7G4Gm-EK#Dsd$+oY3MDP%kN%5IVDoTW?f%S)$U^jgeGL z=g7yVWlJYA7B$qZRy>ivA=GUXEu~B1zwugf2rz{uHplHTb*qgE>D zS&UdrlKWbGBb($pt&_lrZl!eWiGuNzT+XQB0@n#Gxfz7zBXKo9eVNEv9Vh&L^EfW9 zxv=v6NVn-h$~xm{dJGlbZ8Ls^wHytH^{}lc8vGsEpYBR`5EVAKiqqDI&$GVkF{V4H z`+$L5zYD<;7`SxDNB0?9!#N2|qb^&e+R#mSVeh9;ZGzeedrMi2|TKy`BVf45H9{!5+c{aJ+J zPy1B7rY@waDtcWISw(~Z3=Je)Wd6p9Tz89?^PWbZSjjBJ# zE+n+OQJ%%+a)bLmo7cnqUH|P3!Vsp3CCXE^&x8*}6GM}f&i99SheD`#mm9^jS-RvL z!rGMeoDG2-5C>oQnkW{-sIDlM2m53DSnim8f8xG6&i6vns^6QthBJ3=!^Jt;5~T## z1!qDe4YE$I9cC#A9hmZN;ZD9N9}AmjaPfzy(neiVqgaS4!HJkCyq! zk%f(Ps#V^wRSA-`#N@icT(<{j?SBDDj`|BFLpCzr!-tpB@?E)k5@!&QOrK3;aqePY z{>;nL0rR2SPaL`d*Eftb$uLPZvNo_X>tRY6zhk|Yc}V zok>SSo8Z2k-b!ASmSo(Q|D&iYO^ov%(M;r2N9wQIRtbMQ6To31K8e&fn7e~uubxQ;TZ zig4>RU&gNC#=`|Tj6`lPn_9+kJSI{$r3ob6@3zD~(-bN!Qv#~9HsoZZ2o!B^zR4v|0{X_Ls$Q;LQ>W3G;k!){ndl?)XQ5V$(XG+tZ{lV zjlaoNELwx1X{XGKWwP5%f>%_B4beqcy~6oD!aZhAqh!vi$ou?i6D%+BaMut?ae;T7 zT3^X%oA$fN0Zs3N8VR8HV76||ZLukZNez)joDFnEqCx=rf|Rvs9-Gu(W#AuJgpAtxz}8U^S`8 zY|^1-*;KPIjk!DI1`M*=IJ^6i=1x|+z?!Fye6O0Id%9m-STq&bZwv+WBeZ870KC=;sp z6&bRge1}9H8U@w&7OT}7n@Ap-tdl`9byIqa>jl2vz1u`|=+YPJzr(T5lyU0{m1r4n zDRA9cMB9{E5muw7Aklal9HXFM4N>x-mTg{;VCv zp`ao26rUN(zQMZ)_*vu4UXrCQN6#D+xxsAC4LDs0ZLV6BUR;BhV=3(OfD*%WT>{_V zqEDd#x<8Rw{PNKb`l-}#E-~&eHR;j*xMB9$KVM!V>3hJ_?f#9Rcl;hI=TWLxwEkZI zEI9>SpzVCqZgr01IaxzOy0M)M4P%-3cJyB5MIIs8@=3n9gA&!~9qB+L&F&9HHq>CmwGHMKE@_|SvXOU2y9&e4y_?l+V#TaAKOFbQ=A+R4U|{?+_NHGPEVl(& zvGD$>sE-1O1KZ40DVZd}vo!b!Ev^kqJquOiS{EsU7}M;im00~yc%Rj}+S~N0nsydZ zzkOv81~CRMps(U~2_*$X0iU#fr^-ZC-PcVw8KXOnxh<%>0Bt))S(>O_WOSP*H<9U{ ziaT1_%d=jNrM~%RuU);%R%A0FA;rsWzGM%1P&Y9?uJd`V4MepZGcNkSo}5$F!l}YQ zt%{R>Y*oz{+BjLCBk(hKbW7!0 zJ9}3N&Z-t0%orv8x5J69VHLcnP+L)vN*yFYccO*+QuS_W68_-$R5mN?rpFZL;n~ac zOHI#*%B^uWw$40Y6b1(MdeVX2qn29j7m8_oC=U$ZuUiBm&7_bX&2$59Z54(YhL z@z9)DUn+uqybBJmft%KMx7FM1yz4U_ZA*1J&ZqWA-^aWXiOmCQz78gMZ$%edtOjqd zt-BJ*)GX`Qd8S2gZ+!TWNYQ-u$%0FT9cuHY1My-$7ATh6pw?lf84fg&22pbM2717> zhvl10S$DU<@Y0U`95bPeZ5M7RmYBAGo8tOIKr+q3=@8-=ofb>ju^m&T?6`+yy(j*h znJ30wWbz=Vhi>i0ZjdD!WmH>wX$cf;Hs^b`@sjQ zj+Z&n>b*8uz&efX^=>vJ_QHcxGf{iGf2;DmZKBu3^Vl z&u2WWIH95OoJ4_s-rM5x+uK*w;Dc?BoD4gt z$P;871N+2Tx*ftM!W??&Crc>NnePzS!i13p#8O!HR*<^*!4-vlcd#$}tEtY{yt7p&cW2m+{(=Pe;PW2 zew+OpmZYZXc;ISajJ%tS&nEIYi6g_!Bcr$~}YkkTr_rzEn~ zQH~Zc;dB(PgWKg7-8+MH1NCix(GO88NvlA$#bC_Eo!B9bE#9kM%YJ3^}L)`34*2f;yQ_5g+X>lFb@5Q+Exbl^35PL*ycpK*-gYEkRyt#`L$&O z?!wGRapf5-ZeVd6+6xy%x#BCmRoFXcD?qAq(SAq@hiSchC*AEwr{FmDXvhn7!k5R zd4^4DKuy8E#7yQP%)67^#^|F_Kjg!F?3{B{L*dLYcY@07*pS-^AV@-Z|Za{MK>?U5vAAgBGTYCSCRfz zMKC?ydgNNf z*U@8jQ~kPQNco&4TIBcaeHWZ!<#!*p8|v1E(Nm{0-lF4xEN6!+3A zAMF=g0=A9oSJZtg0_fxn{`Y$RW5Xk zkjo6565Mt>)WET;$&hx5s4@BIO1uUOlaoNQ{;7w%&oMo}i&%c%oNM@-dYdF>ULvY09yN9{ zk6lit1=ArO=KTF#Z9=>*sTL|a)Tgd?*1_EqziyiZc-V*Uz!Gv5y_Kz$tfb0{8Y^A( zK>_6$Ma{G2vrt9sMJ1`ZO4=IUUoa>o`d%T#xMY$fmq0-bO@a95b0GPZZ{y0i*s z^p)RaZoj@lLpYdR!N;=E&9KsJ;*$m-9j3k;jSaCGiL*EuAK8gkkG|Nv3d$*TU4}L5 zj)QR`^K*-2$vZ~e{+yFbjr*p<9aY4KGK7dADV)ngLUsO7Nr7(M^2VQ?l zYK{E)kdtkO7m^K!?*(pqjeU!qCoFpY2CkJS^!0ZF`Thc;*+!sd&x>G{)?0!!o)G3X zbYI=lBGkLvz!pYjc~=c0fxh6)CMWC#mvn;n+jn}Iw@!E zD-M8LUfj5tdW3h+^YBN)BLg=<>aK?b;(%{FqzUT!C)UtMeK>ciS{XY^cL2UL|DVWZ!WH zzQay*kYy$ug#dH$0w0MZKgzha)X{T)yct0KNjf7DgCc#WBz2Lx7g3j!#zZ~ihl*eH z(|;m6iH!1lW1_5lUv{G9B2$2ZV=c@;wS@Pw(NefKR@3PW!SI=PWw@TZ-fitjHE!td zB;+*(VJ0!u%WW{YrfK4&Z2}6(TY`_twx`z4#jyhVgxbMgTLwy0mwrfqoi zfBfF6=Lo`V(mLrEQsYC~c2O3L->oM-hCy(OZqZ@n+c&%Jw;Vi$e}CbElA)8AVvw*iPZR zY_Y?vOJ@|}Js8FlM*o*0nIsfa1Sgq4`bo}8(`jpYZM5gr)I?6(;kwU({`BVi%NtA} z6kZ_{uti1Eh&YmLBXN9)`A9RR0hi~CvZ=quh!4-kl2fwKn)_*X-?B5_Mb(;m$K;x+ z9rbBb{eWMC_tA~DVhv#?{df&~n?+K*CsAt)el;tqNf_~gzz-pl9sR9&-)$a1o<(@j zXxE$c?jLg>l% z?%q`2xjv$Cc%Df~Aa!OR=<`yyWgzvQy7QhfVO>y7NJP!uzM%Ct%py*LShmb&Hfb2QS16)(ND;ab!yWU(>ThL8#pw zmp=VgOtPjf`=Ax9@kaU*BcM8uH^Z7qmx14?P4_QZhxU!Q(=$kpG9#FJsBZtTC#;KM z*4ILOZk1>It%Zl;1P$hylE+TjKqGHPN8gzpm~ZqEK9f$mn@Od1_=G=VQ?iTq=SKs| z7)z~*&f2|}tU1k2E4lAx(}K)eJkGxoXUpz28-I<^fi8Ah>*bQi)*QfxI885F#S%w@ zNV}#OSO^-6%zxN~G#y3SVBz7wszwqkEf}nQfcKuwQ4aH%n=mu@eRyRYKip8?gm_GF z-jwPTZIm5@JH2l)3P?f}F^T|`cC~6Jsrxa*bk~LjSn?G1s39J%fp#p%5%S?z2eW-6 zFO+@mICJ8B=Bv@Wy`8Y8axFE?$O2iKRUTk@f1Q)0h_b@Z^p3QW=HKs45e!UxH(zez zs~GaTxO0W7{xOjDO(H25T5E=F?t9X()*zD*ZL&L7Ea{_3EhSszHlCkEs?*2hTlRj4 z#OD;A8=jToYiK|6(Gt_hne;J1F*<_>jO#or3=PR$HgL|bMpE5<@J=jzu{W(?r5S_f zt;=S~K53Torlex|93)@LUKk??MQC4uC_snqkm^@RdjI(%K#0M4e&&g?Tp|f8%EC>T z%+IbCOGa5{k%o%&SmpHySLx8b0)?mLMejmsQCmy}%?Q#iq2md$h$5;S)9x$ETNAP; zG_FmE4Brnd*kO~VePZybl8kU(tRQ+^b;*qShaL|`xT`+M(8oFTeC{Ef4@M*oU zz+a3@`It9KlX&c3dR2DvErAiaeNTRl|FVRUQ-q$zAk-d5zu*!OYl5ERN+dta6;54q`xSB_3&r{l+OL5cf+PK2wiVuibk7@4NdoVAb0dWadtKLjZeOkpZ8% z)<_-r4FwY5DV#6S^IE-@)K{WsH7Jjy#;(#W5zz2275!Wld)q()1H#2Yghd z62YDfhlA6${qGVeXtyF;j-SK7E;KjhBYP9>Eqd_B( zrt2$uz$5Pt`N0M=nX9O!a%YQ?%GE{|4f`copCwm1Zlq5I_H!ppx?Ipb#?21~LG*DX zuJ`eZamk#nzHSyH@yAo9`7c$ZEPO>9zgw8Fj0$-!=kaVdn^yZRs$mks&QyNQvgbg1 zj5HDWL>Wba${XN@O0wPjtc>-EWyL87K*=gn5nn#-C6`32SulXauary%ScM>NZLrVE z`AB(r7u&326&+=f+|*2&Hd>YHcz{>Yz?GO^M*60jesN@;v}QM5c8w^rQ7Yi-reP`z zC?WLeZ_@T%I?;4JwGnRAQz3Cjubdl75uHP4=kZ}BD?QP2=MUICV>7d^j`TjZnQr9O zXZxEAml*8)>IdP$1KyN zWK|eg;~J@bsW~23drdR@FyR2nAm#OunJhP@{-n|I{S|66*g~~3xCaF>_i&xB>zz^P!$wPTe zG*{sgI|tnLVu&V&M^$(xn@7L?j;vsuh zM40ACC`V?tHT;-R7#_YGyefb}(b3&B%=69%U5Cez8mg|0dl#dTKt41?n;=+qglK^X zodS)vwnFqkYIKcz7dgIL%=U!H!Z%*?w)bH&@AfJ~sORz}vhfzf{H4|Xb#ew`GmG)K z>jR>@2C|<(mS)OO}oBwe~>s=FF%X(T7kapxCPf@LGttZS-u57$Mw9tr? zZnve^(<3W27k`Iy^_T6RTV-C*A1Gn{M=1GwW+HE90ZL}IxA;H9Nsjt|GLyQ7M*AFp zNO0;QsU`P0JF9UCTW~2!D{V@|Sg9aN^Yg^61#i5?2FXWSKM*YeLu~~wjQSTXxf>qD zZE}82cx+|8&vltz@0jX&e|-e>BJz#(_um1Eoj|)jyTy?@T3D?DVQb!RpOFYpwn_PY zZH-q%!}`t~7c8R#jp``EoYx`9*K1e!9Csir1~Bo77Zwd=7&7!~$lKr{`W)TpN=}r! z^tFhWzL!(-H}xwvj)>4+Fk_wmq!7xf_ENSD$Jc;#yLd9?);Z;9?HPekxHKuqU)7J_ z9z)o1i2kIJYx|lv^*BQX^DL35pQ1w|%04xT%~+&~kfT}2U&n8;L~ujcy6dvyOwbxH zCZZO#nWP^DL!a+jPC11=iynEg%yvAUMhH~)!mm5L>5JSRbIWPeo8sHC=aYRORtL_(F9atpsBUHGNvFR_Wns`4R*`B z_vT@?SvW5X@#Wskq(6cVP6IpE~30zSM ziaRzAww_&2uw%g83*Z$RMda@}Uf=I(W*AaiS$`1N^LH3Q(#fS8w8ucOxGD?dbQ~MB z__WcFHxO26Xv33Y&l%Edhftw8H_%QX&~ilp4?r+kz#sT^IxZe|B|SyKfo0zfq){zu zuDbtldZCi+g3#@U%*FJ|DI+gKk8t^*wx|wJHz_2Nv6R0w ztRT*CH2zl6v=G$F?xMTc=?>#fpR1sEwjQxe49?Pes@*J!H|$>-6hT0$O&(%6S#5~( zI4%|wgu9*j(Ik0ewOW)g09iGiz#hh@rJJe3W+9`{C%wO!_>}5yHSxnU%6tp{RdIRr zYlKT9uVAa(4HS_!;x_|4?kxP=ec-6WY*c%YvGuxmOcvuSQ1ub1P{k8`?g3l;$x+fU zNf+!8%h4Y;dt}Yi0+LG*a?#>OWJ`t&+K`1sHx51j_cx`6hs-$k!F27D0ZO|)i*e_VWUSv*+L{4zxlD- zdy~c)nwQvPSnuaZ4(xCx2DppcG3NWnbe~*szm*Y{gkcE>5+HT-_R$`bYqiU0}uc339j$i4+S6)Q2s|}v47wbZnn060|2Ue ze}x++|Maw5LWT|cwJ;l)^#tJv0VQn~l3NwfhEWvSb9POHtZGrG_yTJp{psl!9OVjnK-iBU1#P>^vaWx6>)vWG{Ox=uZE7Enh!+OGZlF97jsx<+h z%5nyb3>Piu2ZrQHJ`|t0Eab1tpqZ{KdjA}=Bearr;OsTmO20Q#YCHuD#^Px`Hy_^h5ryryFai?1AgDeNsRAP+e z15Pd;rmT%w!e87cbgBLB6HA1?B<3)HQp3a%5T1{-qOvKOL^gHt0wEwF@bGRXk|wv1 zyD2OoJXm->oE@fn?}t4mYi75!xXW+sMxZ^bFbq4S0r*Y#m-HQTTbtBwm*f}C#R zL{#;BYkB4D_X_74eL%E|DgNA{2TGAwwtRa}uB*eOwgP3j{>Ds4Q-ud@S?X|x9d$Gc zLey&S+fwai*Wm4Dx_9&S#bi42r#iz{Ver8ujH6=No$tzzaK-0xvqr0{bX~noEU#}Y zxIV1lxt0Y4Gn~jSQn*%Q?bqNvgWDX(!IFpEvsaEZBKwD+ovXoH5^01C(Y(t#|*oFD0-ZN66^ z0PEPx2ECWd;d}Zk7_=ysI&nN&S{Wy~IkelUA%Ltl(v~Hwi{Ee-Pwh&E+^VR3Ee6u) z%k~kJtOU{Sd52L4R2k79jav~Qw&+x8idceH+!*VbCib8DPf1E2e`S2hb!HReq43q> zV}?tvN(qoXwz=R8HFtytQ1nH75V2O_KwrvNcuD4F!JbDsx3e}VhaT9_^*^T$=)+H| z0M6AZFL&#v-3i^5m0CqLI>iNFhLxLd7>-ubkiU@si8jp{x%7N%FIf~xn|Bd0v1U{~ zID{$Ge~X=&g)C{DH5*?t6F|ZAUGd?W!<6bhFP($o!tfCWfSZQJ@D`#BDA4;QN~$oK`I@zVSS{Hs>pWgKh z1qZXTqFTAij2FL%ogLA@4dwgSh#J_{&~e`dB1zHP}*(%s$Ih>Jzt3?GlJNuW!#o=xXiuQ@m43h)*VpNqu_PA{? z&>`%X3y=d_^{U3~w(6mvOf&{9@h@F89-N@_$OAf$#1KFPkZWhj?CdwxMQi$!?`}=R zzK0p5-u`w)T{O%w?k0`;ms{w+!I>Jm^=Z(e^lnHH22`s@YAAxs84YZXsU^@lO^oRx z(kR60Q-3j18BM;n{{T!0PInB}<(@YNE)o-9$Cqs?+zdylA z&=V7dvV<6>9lZ>KO_^d)fHyuzpegKkD~sJH2Je8rTBnfhC&43;szy?2*ZeZ(2A{|Y z#dQfbYabMP>Y7{{pmw`*3!d2VjkHg9zYd1c?bnl^gXxdBKZ~a>x&Ry(sDAAkN;j-{ z7wzJSiD1&{QYJX}N0y}Km}XB@AzJI4%Ps)4pK=c=&z;nbSG?^gySHeKM!96^$23pH zR_qd_1$8~Oh`%E#;P4`lK2Rp+I~4nY!8k<>_c4qk$9_3xxD|7pwknAi?|8uW17z_B z?xJj2K1%{D&BL8Sf5UYA2Kry(7j-FR-fv?~#_ftu_;DQMVoCX)!LhCM@zq6peM1y% z{5&yYTq_pLnXeMI!>Orrbh$6E_#tBzDkBP;RpmxAhB|5Zv;3#1wbq-DuaT3&*AP!t zlRNj8bz#nl8~5f$cH)myS=n;h|AV!+j*7Eg(!EI_xVyW%I|O%khsGtiTY@(3?(XhR zg1cMr;1=8=!0BYqnVIwM+3)$zw>E3>Z!fy2=T~*#PhD5FkTTOcjoY^tC?Ty_Fl0u1 zP?RdAIMSw(HYsdJCiQx94=WTKFHCOhu}7PbPVT?I_%miFo#iP_19}jd|Mo%r*Y;_u zRu*;ukX+B~k5&Eu{6JP|{BJ8qdKepAD>%%$Dr^>_<_dl;D8S!rSS~bm%mg#o?L4^l%(-{IUfTTa<*0wbJ!wP& zgs_tn8uCVK4ZG)93pYWB+tE^EtpWCO3o1ED_k}pNzs3R05L$2=Dcvg&wwT9L3LTy=hnpy)VBM?qD4CFw! z+mbodk#8)IZaYYCW>4?6{mx<1hgHFZs1jIyE!%HbX(ThJZ#-NW!baWDhpb;`6R;&W zl4v|U-_o~zuB34wHH>3ez`oGrixf%S)`Rrqqh)x(puJC+d^m9!l!kl zjezI^J2WY>o=*{iP{l5IWH-or{IF6M8yOpEf%L7uZ4>!1Sc5Dzk3|?&EnT?~MHI4T z*1FsqufYT1!b1Nh0^B0y$wJk4A_XQSoMXBJ?@-?Si#Yi`IvKnoN|e#p8vRR%NKu^x z-zw=&|9QVfQ^N{g?}i%JZ1Z_NOEn#$>1dIx7w`fkBxcSsSLSML7vzk{xz50_98q{o zA4soz{ck_EzabvUSI66?3CXh5G9*t31a9=m0t(C#g$JXB2H&fu%2a;S7kA1I=uDa* zFnWfHjQ(li{1L$3p5uMS#Osk-uo(mL9lOCn?beU^H8$hB$<=W)SGu#UN|bX&o6C>K zO(|`4p?;-OaFS5t-Z7QWt+<0f($Ig2&oVx1IJ%}4sX`yoQo!;wr`_N5sP*H9uJu?J z{2YQ4@OU;vROe@udwt1f0%O@1^dVvs@u*nQxh$KO z(^~(epZb%uYP4-5<%$GmtU$Tl`sw3pr;KkJfa!ePTOo_HsXle$N@i9H01DXt;&CRcaUoO)tl^1ahI4Rmi0^9xjaMIN9T3HCv z;~o61ChuP#PX5m*{GQeM=TOA|8G;8IhLC5-&rUJAT5H3@1AMUNgSf8J0gvVa{#=D)W~C4QC3}BtdXxmoOTJz(!S>hLqML2X z3s^@B$%hqr=xKl1XSj_0{7?(b?QI@fOznZ6*bBv}I0-EcFMi|e5C;)^mC>ZHPFJa9 zhz*PU+Q3>PHmowrQ2TVcIi2PO4JGT2WPgo!H51wlzy3TOP%Rx@b)ez*Ku~4=|8r>l zAM)a_O1!9eeMMYhbl@h6sdjFFmaR=yzHz^zjD1xUOfwA3qF5Bx20{lKcEk9}de7mP zt3f>Z&O?w$)7s0NSYD0MEg_BPdO!2PXZ-c?`36r2d;x#fBc;#V$AS6W$e-j|own>N z%e?ie?B|J-cbe-@WzmJlXH5pOcn9!D=7(@VV_n)y=jrp%!$|k{Dx;^5nY zjb|gN(PVgPmNXRk=HGU-V%yg>M3(qkbX*|2zv!MjpWceGkGipUs>@s6juDD(VAWxb z&@qUb&34ho^x%+&b_o_2upsC&n+{AQT{K=;5w6XF6Eg2A^a<~V5zTVmRc7mh=e>TV zV}dp*fLn)qc~4n)XjJA0n~cMm;J$AZOh{bzH4tPCZ#tD^*@^I6UX;>99%jfM(Yl}x zAW!EnmL88Dv5{y^Cr0Vh$#+5&BoqHw{zz#lPYUj(S${Xe+1}CCRNF_`b5OHJJ6)Tr zSC6-^?~D+F=~WJ=jKKmCf%uWkgI4y5jceW3yXzBV91|@iaX}qhTWQ%)5ISY zyB`9=kY2&QBwmguTLuZbB&0d-kMnG{jko+!>lzW*e1QL<{cdV&`7}5%1#ur6a#Mz4 z!W(E@=hVa0M&!6~Q9&73UZ>q{qr-1DoV2aP9H~)=8e&yJ8INWVG0bWZ22PlDCAM-M z#bS}JlE6J2uvV`^N+YgkBfOXtjyhPQkE1LLT3clAh{i7NlyI8soZgV}dz zbv&p`83k}$QZ|W~Vr7vJ=)HSsNQa`-_i`DkV-Y#XKmtWR`XcDMV`A_R@+kM3fJ#Ogo38 z^($G>%N^4pj1A3eE;o^vJ{=@_Dt=I|tkO?4$8X2(r-OoH4A*k03o-*1ZEW`Uz$%w$ zeu1ihm+V5RqB5?u@WJmOkP~BZqwBJ{qCi)nN>oroJ}VwkF|KR4QBP4U_9w?tCPeG$e?9%4Q-Ble6m zhJQi#BHD4W$P5&Som zxxZ=v{|A~a1X5u^U?GL3mddRFc5X@vW&E%HCTt^A$DDq$YhU$n9EOvS5uOK? z1S`J$$gaNhBhf{)iKB}CLo*u?&4_4!mp80-ToBCwy*;Lgs;TB$G9a4a{GnL`yu}}y z;r*dmG1F)aQ&BbR4Of_j4p#;-Sf5@#``zM<4AFcg=8COU;J)-M;)ujKBSTD8Jy$K3 zO?=*5Di|zd7Wm?XI3@w+c0QUuW}2isxT_Fn)u6rEBL>6N7w-FHHuaW=t-={meDflM zc=)_2uRB#anC;Gd_Wzidnf*%GEC8`A_}|Ae&c6)&{TItt zlf`2rxRf;C(JUod`UoQ^5%-`=QTvM#4ZFC@fYibnS=vGUIlB=|sSiJpE+lcLK7~mf zigKm#SWISKXN~zhpMV-%FpXM0F`{hrOZ4pZY#xs@qx8JDDz({83+g0Vi(i?~D4Hdo z7syqzs?XLqCkR+}M;)oLfwU@NU5(mkBP2EArZ{E&?_#1oNKYSEQrQs7q<@+VpGAXc zCi$CY1Al0S`(kxBCI75tDT2*TeR2zZaD zrzL@%t(IZmLSy%Pz!R=Q0o%mt5}X6kyeS}>o&1AlFYTng^NJaHM3!F})wN_5o2K5{ z9u^uGWP%n~@rL-76QxxheGm9$P7gWV6-S@FC3T@fsP=A;G5daKmq%5O`L%d^H=$$z zOB!&ShS0Xsg6Q;P5{jX_R*Eced*Q^hO5!d_`P}Npl`03VP(y9gx(2_9>NRJn?lWMB z)it{Ta2*fxiJ0)m+o=JQ1N@lS`yF4|O}yS$?`pHdcq$#a}u;m@}gc^d~*A zp+woF_iI^Iqp4qs1V3q|L-u)uGy7JLkEOb(w0~Q6j8!SB#|U zzy+uMQESX(aCGYz(eHAch*6fV2ZCAXzYk_ye@)?dSw(bV zAx#BBCDD3Ik@{}{7%00g0gUE}=|DCCiAhQyTt)-pEs!;WC`!3EmxOQn_K* z)70&PJ=lq*nsV_IP#Vh!>pElLI1d*wm z;zJ<@S5~I&KCczI7=o4)$Tgx-?0~0P-xE^HHkYt`h1b~V;( zBa3n`N}DmJmAfK+r8a|g3ir&E(}LK0`-PKMfwhEcRW=`2;)3*>9>TR2vKEbjwx2km zkn%H_?0fHlLG{wElh5V1tCMS3N!WBvTjmOHcr^DAs)hFr=-s@^TVMCQMXA3`Rk)E-&sf4 z0<$((jz0h=?HwoiExPS5Q&a~boP$yb>vo|*b~R|xF#8?5)}19jjaHF%!P)*3u;%Of zHEVx_IapYz{;eRwMg02+$Nksz_|I+)L^$LN*kfAay>?Vz=HG-Xqlr}t2osDwI!i=c zo?Oh*P9)k2eCxw9WWMYn`VqsLy^PBA?Y}ebdg-1BEV)iijOYyO5-fY2kk@0^C_L{i z7{oYZ>ZJ0aUqK+oNq(LnS0SiUW6Ur|!gku@Mu!(wFY8xWDUUGCSt6^CRNL{BgyN68 z^RXLGE1oBBZXj;SPm~%(S<;Dh%_|SOJSmZwpJV2~)m?*-kIS@JJKQuM2D+Dd-p4fZjQzsN}KPh-5uFTkeB1(35N94S}LmIPbk_YzesNpTg zzB|9Ua}nT_SG3@;j-l#hgVAh9p<+Psx>cQG55@|IR3zIGcl&7^mZudlM~K*k4 zY&GR88PA{%HMTwNW#5?=|47J}>ZsgX8NoBoHtzaHiHI4>yZ*$dW%~Uz+EO3IglA{x zV!((rJgnjpiWGN=J*;l_r@Gn*R2{3{%02#DOQ}-=700C@1}!qqN6L=UU_g6CxMmKq zX}N)4Nk=;J)jx*W5O23if0xlfv5{kVgfkb)NQJ;B&1}e7Np34*Y?c-vr{b zvLUUOGX&*&*Qrfkj5uPf=t8c){<)#J8J>i&1ko<~-$y&1zov8ihzz(eX#dw@>PUa7 zgi)mxsos3E;<(2T*i|$ z5j_RuRgfofS8XJVyY!5`^YoI*8w!*qly-lcCSnfy#ps43h1Pxpm3@C zRVv(v14eqZ zqGe+Wc0t{{BtgM1U)SP#ZcD8UzRow86VJcpT?H_6e$J!I%MryJB#_&U9U|{jxthe6 zn*oa-$GYu+c8MPFxq7#de%Aray#3F@OZ z^>r94>)mTL@#6E=gTNFWtcYq^v9w*ZLL(Ghv`q=uUFY8oG~%w0Ug7B&ygFtxSkz-) zj!74UaF6SBnc|4#sNbn7AaA0l6mS?f{Ab^0KIyan=RGc=<7ja%h-zMcOEt!S`5yP5 zFRK2M1iu{`Kr)TbnDIYNrLET97d5HLTKOx%HVQ=)3gL=`As8)#*;Q<#HrHZv+SZpf zcI$37JuSTDW|M_+5IW!7Gz@L-UQV6`yt^h@M!FtfYr9XgIO{w$1W7cg{78JLdf?U- z2lQd^zN52{8O!!kZ)}UF-+zi=#u>zBMg0|hEr4>5Gl)}*=Y_-*!UA_IUZ-z$otiVCLNMw%pG96*?2m9j<*WOp}V4P*k+(LUOVQ zX){-f>`V-Y&V1MDDWZ&=jce=m8loG(Oz@*AxnK>n<#Gk#4e|l$$l<3*{Pe|JJzAT! zhR8@7A%#y?NR9rD=60=Y#0$ntPULm{SC+A01bkk@}XkXX?sZTzi zz2&DUo0{0Q#WEbXs{O*U-{?-OEZ}+Kq^*w37;GG@Q#MVkS0TD<0l14ne%Z7I{T1+? za(Roz!m77)gTONFNBWsYjXA063A}a={j}TU?2U3ycS@nkb@kM8hfU1OBER4jv8BXH z5?zPBNn$1-1hk_;TYtnDd4&YxO5B#(%7m2(QVF~!ba>k1sl%xam#|NK{D_6>Q)G{( zyx=+=eI2fPo>`k{0%JCIG&R{gwGmhK_Jbh>f_G06F6r$|K&@z2^W~gxU$LCG#-_ST^J<`t>6s_5%7I=|Y zrFvk5f*#U`@9>xyfWe~D&vath-gb?SeG~={pn5DTYL@y4!^I5u&e7Tx^-7U8cT1C9 zFz~>_8pb0{CTE>X{FN)t;U#3oNS9(6?+KyX;=<_-2>$A<28qu!eqC3VQ;k5&(?^fH zwMCfMtx6G^_gZ4q@r*w)5BEz*?_)m9$7Ma+`5_$piX}+&>?Fjv1qK+1|6Q_1H99 z0+(#dI`1Gg!cw;6Eho9(H{kev9lNNgpQq+ZLZ;r9!kH-dnJ0si^{9q!i!>=;+fLGz zwWQnjz&S1V>7~k{-+ClfNSetTEfIeVMm3<{mcz*^_embnr^uw+_Q6>%UqibY>7ob< zKcw3UpuL9@e>8>x7l%(~DI84+kn7g#bwD8#ej~alkNSYGtfuIn4Yr`0`;~G*^Bavg z1{`-mX{FzFI4-#=(Ys|xm|^aG^qJa@uf8IUzjEc>6Is2}omOMeZ2<|KbBJcgEX@}X zF&6>?q^i#mZ4!d`OO6W$A(W%B{&aJnp8|KoEN+~Sj9MbH7~NXGpKY^XW$52@JkSmi zKmXZYR(rRSwF)Ys#(!(t{jcX>{ttfs1)W72|Ka&i*QM>go_Zr;nHS3))@5fb0-Zux zSlBj=&W9im?b=pq;%#c*L>O{wSM)2XyHAx+C_h?_ykEEImAXG|*;btovhAXl?O;6n zI?I02?DXJ^zzg`d_n)P<=));zJq#J(Xgd9o;OUEFg_LQCXsx6fh|2a%z;giXSrpsaN zb2RnkoAr0j-reIDNrpInJ#xV=4ha+HkMh!`gU5nIp4cqOcv!Q6&H>EZhYZ0VI6n%9 z9s9Sc`chkW1DWqLfxDl7z<_f>AG#6Sbk8Njr&Tq#%q8>r%iib0B459JG3q`FPmX|GWE;BZ*;y2LzZS1(#L^}QbQ>&VjQvgBsPYh%!D4a&fr-0BR5YqbOr;K8Rn zjclkH^)}RoNyF(rh%mI!cZNvIXnt)9c6R_7PlXz@Rla`hS5ZZnYk`Ar13a&OqW96>?~u0(qjR&_q6rloD# zN?LpR+BJ!o00-=~S<4xQtwLSy9z^gNa{X11Ux<5cO`Y^_ymEMla*t{6Sl0FU|*!l}L}{fKR#)koRhd;a-Ny$r!+q z4ehl(LVFlPj~aLid9n00KkUH;wK(=_$cQ^~%i0UdDzrlNVdJ1XmS>1@Mto6t7oprX*4<) zl#icr$jb;)*e?dAFDM++MQDtQi}?dqDe(4KuK7@t(8w{Yu_Ukx()6&3VRLu+NAwFn zA4NFp57mhTF)Nq{4l9TsMwnJ{r@Cz^W*+q(Q}JHH`r)9Mm6Ht1yjv^ip!18@=kA#_ zA(x0g?VXb9kAa(NoE;FPFnXh^LUs>NSk!!Ya&$q5i#f!FdXl1od&njf-ODc&RdE-~ zv?z$wE9Tvp(z6B9JlqLWqh7fqi3D-8Hm=+d8OfEUDIb@y4|2)LnP9L;>rznA26vIJ_m{Qh?Koc{mPcBz{EZ)4lPl0$t}6;B=e zEz5Ldzdn(jK@GjC8C$d&nJ!qSO|6;%V-`+IxAT^qM;_FmI7el(i3ucU>&<0T z*v!0K|04M^dDhFG$E`+Gzq#kLwE5Vb`SJB>j|(j2QXRL1C0ztllkEZ7gtxjV55OMg zC{C5=#2QGWr5e6Q0yBfzO6{o`aPN29MMsneWOp>jl+Akg3j>eHLYtdF^4cIPxT54}ao7B^) zK&8iCm~u^wV-70lp=o_?YqnYi05@-As}r9+D}CX66glh-ff7;G}tO+9g8= zr5KppJgiA9$B7*ip9AOK2lv04bEsSZ@lZXHN@NRg9raoL{fFQ|ps6rdf@+}j^v4+u8no|{$7 zEd-1CHur#vahpdyBB5psHkkj;e~4CCKWi@2z*4`SZ*4ClAl3)4dVweaQF0_e(z?)& zEFh}_zb=Km8R*>qRU#cq%tUN%K%h4Nkkj1R$=xuu6-^N zbSv{yMn9gIsQf*kyJa|oGt4yU)GLue^%o3_Gtnis+k3VoMwC{hu2@RvR7z0<{aoi_ zH#XR2MNR^-^HmBR3@7;;fh2O=6^2{m$pxkvOkN7Xq^{N;#+R0dDr z&-09~bkeEU*ST?5)RqX}Y0b40&1yEdA5a8^|qD2UTUIVjyFC zucu7O`$&ul0iRa}-fcedYi}1zzWsCm+K6)LujlWD-@V~$lXjGT7+g^RyM%mk3BD*1 z_DOFm{U#V*?POskhP!+nW&FcN0Crt%E*Ex(*%2)Tl?Im&O;jfwwp%qLXNP z?1A|B6U4)xqawW2W}Pyq)w%s!X3_p@X1N;w&1Sd%^0(6V&S)=cK^L{MRxw=pB&(b2 zC?$;+Qp}BIjV9v>utmC4J6W#9BEMGk2r1$BgNOzz+eQc@3g&LuC~Pj!aE;po-ShAJ z9Aw&0ro9|&e$0N?8a6~TZX`SelWJAyDB3rHj;fV9=xyCy1YEUlEdbtg_{8Qn5LvfY z0OGa^H&=IT)@<61r?8?;Ta}a6xbOsWxB@gPESj_J(~oPliJGX{$WwyQUs?OAeiaS| z>x0bm=eE&h)TO#HT=3SabP+PxODYuR>fISMsd-c=e??zl?+@|2GJIX$s@8_X9Ua;i zD*Q1S6)PO6({$FX8ss7 z^)%O^b*EhoBQylJT(wQ61uQHod6UNvLF%72_GV+C#|Q@F@Z7zn%*yv6>=J6=T;c2^ zXS;G|O;UZ)r3_sjt1lq*LEG7)?P-)0!57jr;s|6pM}AFe$wdi$XSnv?b5&EW8rIlb z{Z`*az-I}U7BM~wsj!vppD>L5fNjs3Np$ek-Mhu;NYhE(duo3Lso`LVP+_gbc7e#q zMlUy5;2$w+cBWn)19*IMtj_Co@Fj&uI8ocJ5vE&kGq}BuywKoRTxhZ84uM@;S>34@ z_uq}dy1nF$X=RGZ`bdADk~y`nY1sVoepJ#kHv|x{M#DoGj{Z}N1`;IY-(;iE2QFY& za#a}wR;=cs{(^8mKHbQLBv4f8E193Z(F+oglV`oc4U&2Py%LHCne2iS76&r_DY>z#hC9IA_o@ZTnhl$O?PuwewM2qzgQxbPb}pXiT&cIb_rIg z^@LDoC>6c~AH~KFu6ab45EA`!wfC3$pp}4_p z(RNMfOSA|4v!q>oUK$TXj$nWynK#6nkNutHIm3!~#v+SeJ_g6Rk`64#GZm^Kq0zBR zJ(B$6nF+7zq3Ai;?X?y}OCL0(v}pk}W2EJj@%Hn;tYWIn&y-ihU_m#Tn>QA8YLY7-((#jq3kTzm zyZdlYHj%MJK@V!&%EQZ{sqpLf2Whfd@2ENqk;YLyxFUI@>8Qz4=F1?fjRf-wf?^zO z4Pu77Wiayg--jz#FZsXyxinvw*p-_D^*OzN%Z$J2b6g$%b|2(#YN#W>MxS~#+;O_f z&T$SXrKithrQ2G;u_OAkJ6eW2=W*tJgR^-yvTqW!xeGA;410c&2o?JcMO>tlOG^FMhImrhm2sZVURF0*U{gb|=FDpHnMc zh_{o6WKRbT?{jv*Gpq*oq}L1K<}S#g&O6%*4ydc%BhWQ-@6l)9^yGEYrjinJ`&1~N zM$%>tJEv>Xnvk>D>hLZ0d#!G!NLhNo`O`Y2`>{kH>BwXGI(sE}AIqK~I%Q|{5v!Ph zD?-ikROfa1J z^kq!o0Ux>yt0JkV`Qm@r+6DXMJH#Ph8miWg>y zaP1_U7uzk>yDt&O)?0ox(>Ud6YxnW^P$fc3@mD#1h z9BWrMV=2CbN$Up769VIjXw(A=<{n?Se4==Q+69aLCoj%`j`54p{t9Gh7$c|-8nrqq zD3P?&AQH%=?~51M97nl~x30i}k&GsLZiy7{HJlFPR*B6po~OZSKKgU$s`y4hNj}&B zH$~(EqF7o&e+=2Lq<3tm+pR)7_!Hj{p0;=M^8Gwl^zpNcA5oDj$!Yt{bZpp>T;bTM zb|-S@X2(+UQe4U&;EcbL5cX{i%d;}i4gHuSdtk38dpKwhjyvO+?NT_wuAU8NywK7? z<#^^p%^?Ep`#6D#KM@*ns$vTf5Z|hj2XqKS^pV#CAX2Evcexs*tr&m?v;ZCJx*Mul zaLbv(>PX>oD&hrZ3`#yK({hnc>0uBoPzZfv(jEYHH)Q6hAw^#UCcvI4p5Bl@{iX)x z@JYfChi&E``)p5iAZkE9%yR>Vmt#}m7oO+F7bas90&9TgFr7GJ1VgTgakAy};7fIh zO3J;@9yZblBi+ITBnR)q0o7doU;ezCfM)So`Av<TNWFRMggf?^avRV@{kuoJXt2b1?i zTP7d4Ot1%Lxs&%&lSruss8n__*1~6kS79~K*8ocCKwVph5I`PvYlY?tV~t0XjxG}C zO~62gUTem>S+X!gnk%3+yAPw1RZO;dht(2K#KB^LRfl22*n<^W$BxCNa!^-&Xw6w( z_t4He=EMxu=2sexT$!wt?lONI_L#IfXo)O-q`P%UY4r-nq(iwSZ1)}q-5L!ZMg)6F zgxf-`8~jirXo;*V9;K(#(Z>r4HtB=SZ*unq)1UoZJefoF+I~Ja^QFpCA!J7esWkYa z11kU~HNqpsgsM0CePzz0?Si{zKopSYd_22Uq2m%`TQtovyy}SBW!q&I$V9XBM4y2` zAcH@@%g}SOf^l7~RwCuxGoRKGXZxhN!7PGdDjz~Co4&`by0ep?{Od2FI7R#w`JgJo zVrGqcfs)ZB`Lx$ErR*B1FWBZp9=#kHK0}|<)F|mhzE_hd>%uP5h<})27E3xaM2ai- zC{~|4$E^ZZ9$+Zb`JCWr*sNY17fV4b)#I99lmWRn<{hx`V9%@`;Awzq4zcG_{EraS zcWlyZWqG0UG|h#rHCw3h@DZZHDt+Fm7OmV$du+RJhHGWfA?Lv+j9r7}0k%LJs^Jgn zzO(1N$7$7Dcxoq9mIlCn;z;i)-T|}m@2flc65W(B?n{?IIBOC--Y?(XYq&qA==mk3c|tKKuHzkQ4g}*!vhD=z9kP*1pcIFMV$TT43AZZNJ{rM=faFK6v`t= zp-r6S=vQbl<|vl*sUHmKQ}M+jCP9N*Phj*}j~H<|RvZD&?M ztjn+GQ4nD{swU39?3)Y;XnVJXfyl{^s9M#7XrXeDAILWhO1M8uW2s2&i`k&4zr@VM zy}0a4MoQeXeR+yNB(ylZ5BwTS;u|KtSyS_?Z^ri{C*%vd#4yr7b`9wvr*bFta9zSh z*~z)NcP!;|%Q|Hbvh_P2-_g(Bv@o$1tArIf@|4dK^}VlVEES%{avUIX^+A5{LHNf3 zM^px(0Rwcv5&c_9!@u_M)v$85GPe3;<>L82%czR}!?A3K+n}b)YJIv`9*?@Q_!erS zI1wyLl$Z!n-f?!iH7^)z@NRg+S^#gcL+X_dw0MzF=)I(0kjHO%<5?wD*(s=73GZZc zwm54$$mVmuy8rm~<=qd)>>>xm<}e!i!ni?w@bhBikgR?Ij_wk{2|y$(!V z)y|)DNV?BBAe76vRelDYre9Qa?#G+8Z!ffUO!-PyHL(yjW+IAyCRfRTx=p?~^)1<% z$6tbJU-gB%%)l8WfyK3Xtt1{>u(k@0jRaz858s-VRmZ7QsJn^l4(BGm#f!nVZlb>v zb%d7$!i0|-o$<(z1Wr@UhT*578?#>Az2A(J2S&8{?D4!MuQH~{ci2<3$hN&ZDOhn< z*3^Ud5t~F3)jro;TZvbBIAJ_@fuPA)zWGI8kXVgqd9?b2!B5FVOWw5?W z6>($Vu3IY;V7fUmo>Lx3=TT4cOv3N`xuXQBpey!Vt(7zj*V=oE{g7&{k<7q&5>(4A zQh~{9*Z27wAA|U3b3w^exQZk$x7HQWZiWy(VoN8>eTACeR2EHW7IL-qJkb2_owRl)VM zmr#wSmw=k#Wgs{SUcZ2Q`v(R0;A(ZN-CvH*ox47F^ealA z8>?k7zb+CvY_;BNvDeKHZz0e2>OGFQ)Bah<=sH#Z9l!?nm%+vIZ>JgHLFtU{FUtW zCv?JG7$H1HN62oY^fjT%$7p7)NbH-0)H(QScx`Gs^T65mvVufc9rL^gs#yW80%?6b zKXygobY6^NyJ(Gaxptc2=iqG=!Dqw-w2B%uAVn-m)$F-m)6$LSw3DiCN<*J@_lO-#-x?J}ZTg+lAZd5vh*d|l zbE6OLc4<04@zZ2Y`tUz`~5d%Ff*W zFU?Apg1juaFud=j$&h}GKCYuY8NN1hu`al~4Z5m*r_6jgq1rk`YJX2$X@pb3 z6W75}X+eKgJl+~tG1@7FbX@xj;&=RZgW*=TKnf}k&>+IU9wR3Hr}+JUh+AFzoc_s@ z^3=At%LOqZzjg$%)Q1n}Y^#lO1P%3Us^7ov|DK*gEkPHHNk`t0?UmgaI#}iNWBW<1 z2AdIdTqkWi!8OSSI9~ucy$(_-6i*zj(Zd7YNTgkue(eS{WY>tLTjtx4Q-4Ak1#oSb zNeiMvwvetFc%!|C>K({(m~W2wG-o<{gr4PIHy7W@7+sme>%5$-n4YTUKM%@TnV9`}Y5%dOa~rWKYZVkR zhrf*&+CN9k-u@Gly4nY@cf_@YsNjFj=%9}Q0}TTG`T5t;C;Oj2>vyZI1p3f_lCAkh z%KldHiB)j$ve23{1;8yK@&r=1B7f)-5|o$2HWy(2-*biwrfJ3!v@XkkNUqxRy+ z=+@PJOE`2w*P@=i+8X;Ba<5{NTHWLx3k^?G&|?nJ0Y(IA^N6oUpAeE!06y#44t!`D z3i^fXcjg63+0o~NzWFTZ_g{Z^k^jqg7dCcwaRQjQhya|;$c3Gp0G_|YqGIN3|H;+G z%HHlT&vcQxuJfD(`YWis&_lF2&~Y%dAmiiYW6I>o<64WnXN2VcW(t|DwJb|75vQV` zdTF>-q!^sSpNJ!6$v1bTnzmJB|H4BsSqT`*?2u1?&Np0nH4b zNmNq(wHW?8WmVHDv!lqXLV7CDDe_jry0XDL8K};R4Fmb+T&QM(_PWglo zdGxAmP=*_?fCUGoDOQB)$MZ z;n9a}o%ZeULrizy_(-lk&ij<%pk3#@Y?rR@->k0M&jzLYS4Tb&&J9+3pQrJ8|;_iFJvx@bgGaiW$kTDa0?hTR^mpQ;;?Lv0(oTeOL z0|&0pU-M0x5xScd9Sd7*4JAH1jwz;e8Ifvc)G-5V7(NXtz>#5_rM{$&%QiZ~lF-4=={6|bhble6dzVl27*7q8@bDlb zCoPuf4#TKy9@t43?g^yWp>38}HZw$s>D#$TPpjD)(~@x55n%1A^V$Ot4=9?1WY+nK z)u(`+S_fss;G>YAYaL)xk`rrSPxLEyWkKUn0yatywV0)zWHMa;%fsoC+t|UCEiYdZamMiY(b>6ig)bl^^iR z5)=jAb=8aPO|1)Lcj%J*804*vCj7Y~^RluYNxwFM4EtU9OGYN^5kZTL+0TMow5~{) z(UrOp)~;2HON8BqZlq_L+CJJJWZdZ?{4kw=YPX+~{zw?8c0>Pd?H2!kA%Lj8t%JRt znVri&C}3{pWM*gbR}=myWqHN-EXY~Cz3&5vNy7&-ptuhQ8zchBDJh}NNyxM1+;OC( ztw!upOur;w{wY$dllg-&rFALy=1=>s#n(5#E}+3eYO_Mn)jpN3C|Sgw+}f{HuXdX& zohm#A@Woezu`&BAC6GZPaH&X)JCKWPNq?d%Lf{gqi0%2TndjK~Jr^r#s16N>Bsh!! zLwcl3^Ye%al6N986W=$bu@9`J9J(I`lKJk6lzKCnrMPs-AT=aoqz%qs#VOg40!d03 zvC$!UVSV_qq?K?7ojYfB2+6a>Yl%(zFazgmPA8*TSH zG)1&v=U$DpJ!p$>1*>4YkRyo}KAwC{QWrEo@m9TwLO_6=cx&!6IzX~Yo_U>Zl+jUO zr3EDC)91;j)*lj)yfI`1zOO`PLfxd0Qvj}mcj)3KZ4}0)$39vcgPWD2XoOYuP*&ClgC66Tqjxpgrq9USpYeO+M9^ z$&13-?%asr`p71$$j~4Lvlo)jTZ!uKft(+g3Ovdu?7qvAzrFhb({BRDFA|XmMJrr! z0ruxs+JchORb@nm)<)nUGwa&-fV1K4*Yh(G7^6{}AOErE?lg6N*b%7$Kw`N#>6m(? z?gAJL2Tz8_k1E`&WCca)xMo1Q);M>>g9kX|bN9wG4i3V!%}nx_tJd*I0Jvm(>(`+M zXVjCCLVD9ci?N?yb7QjfMIAF&jtERvQg}xl))BkY>eZD3@4H- zq10hXYihL)E44CgPb;F~K*BdH+zE7#5adAFOlFbC_vln`qW? z2H}jAj2Juf(7txN!nI4+EQxBMlnN&0gjpIrQ`{X4ys0I_BA#N;@x-PPKjlL1={JeQ{&P7g<0jjh`Lupa!TJ|3+kdG{rC1c<$%w% z=}2*^jmw5^I58>?%-s?*50F$*_R4v;I4Av#ClD_RXp(Uo**)45G9~3xxU=PVn&>B- z64-=2pF^FVQR<^Urkp4OUgWHB8wVu9US%OvR}hTfV}{+waS?vw?3NsPKs0G2EOA|X z5QZ{6Nu+!6OFb6wq`UecBTQnbT-Nmlwmh!Ub%|ELud!oa#or?mm`&7_KYE4b)X3lC z+O@nki_?5mhfVUe=TshA`eHtgCKE@t7eq9D=xwBI)04BML(r0oEs^w^4%)Yzo#hN}Oe~gP3vBL@h6n;qCvXbP7E5|<<~&m+c59C`ljE7(2R5S>ReTn--4{*BM4r%>muY4u64=Mnm4j)kf7xkb15=_qc7lp6 zx`T3>iaBa&PTR=zSxk`|l^1YfSEr zkijy|=Sy)c>v*#PTU8p2!1y$es>N#iCtbXKNpP=?QFQ!1R*GTx>k@9_FXol*F?p-$ zSyFf~Q6j3?i88Q#lQ=fVb@e=B^YSIT4;95l=FW=qGp`qp0kr3_7( zS?9eSm=`xIP$`a^(FWpRZmoD|9h%Z-ak37%7U~e#Frp_X>n;#ySNH**nl&qI$VWtL zT)9`Aon=kZ=+%lxxY&o`1ZpO}pq>z3KA{c!`^&ACXexQREHieNBTNFSeF*?}5>Y1P z3#Jo+C_Lepp;!?#y8V`6WAG8vqqy|RXYxyNvsmI)( zG(I@!S1Ok+t*So9gM?9K9r>$rzTGj@CE`Q=Xe0euAcfcExQNtB38dok4~3v z)W<#4dYo59N>!F$VM0pAl-h)i8t05pv?{d)V(G~n` zK(NXsCd_5giZ>LS3HB@P>qlg}NG~|%VG)5bQbj*2dND|`Gdn^X*+D>X-5Y|aWa`uu z$A-I?+ND0Ol$dwod&;_Q4=gn!VJ*wD+{Rp*{AwAnT-Bm%hKt$=lA}fPvc(3VVji~s z;q*uuImTAR?-!Hv$Xww@O}p*LqNd{HKrRkh*20C>=k?&lDylBWt&zxsjD+WACh=Du8ueHKHj3xFcil zda?Cb6H+p7?IDoDJ8$Z6Fh@U8J}<#NE_YY}2Ds+fZh?GV=d~KbqfoFpjc)E~on`1b zVV|utK*lexXP}{TF@!vcVDW5Sa-aE(pvoD{atIV%z8)(TN;5pw>9ykT2rp-)qM$At z&g;$I-ch*lj)`SR)uge&WoPY6mWs+<{C-z=QnE_(^x5~g|M7;zm#DqE5V8^91?oxL zXv*F0R^MEV4wFI#Ld3ZGlAp|q{s+@N!c3!D0`(% zN1#Nj{IaAL${oCWKPKWk)f1NQlzKOLuJg0a_%KG+TQcH9f_nr(x2SrIWr55j)e5&? zCaQ0=DYvjzQBMd0#-5!}KPg6?!!P`O_uHc+(GM-aEaUDgb8TU|#7rV$G9sGH@W`pK z*e0Qn0Gqm6@#QJA?D*_P!7MnvVS3vIR3FjrQng;W<97HeeZ|HASgsocSSbht*>34) zK9MtlIe~bvw}z{dl`l1zf)z#YKR4dBXt(7VwU!gkJ*{&R1mxM6K)b6u8+Z1h=?P_%&xzRq zq1&T+zR`Y&eF!NU&pu#`oQ51~m6y*rjHzZ19O{v7NuU&mOqYO9sikc?1k1G9CBDHv zgbMf^?`wyAwHH)~aWezA7w4KEmn<0W$hH>LXpSKS4Rcl_s1Z|BgUk~w8w#6|3#)A} z(E_JwfD;X4kcrf^2V?L>4#uth_&jGq1m*-0`4&GK6wYCGW59uP;f_SmEB<`<8OH&a zfTRnx1s!n@Sx9yt!;XvPaSmoVw?(kBD@dF#^?F5G2Pv;=aS3Isg|5&#qPj)Tf5}-g z>9?&*{UD2+C&La5Ff8(}$Ug@KA+XA{a6og8HvCO=S8ax3sG;^?zdps>Oblec;T6UD zv+r|Y*P!T&PGOX-n5ks6OUYk7bSicu%65o1SZ^tVJ?Lav;fwZN)hJ5j1Y8VI2ddr}VphWI7M}ezDcvXG+pRd&D@cf5f(l zt2!kbcYG1D30kws5&3L`E@F3(Nm-$Pr!tI4z{*lW-`y})5@4h|D4F+K80>IXNzx9- z+^{Y>foBh#Eg0mq|3Q9RxM=KFb$B<<92b~Ex1TL~78!B8?+?Pb%26PE;yoR3>a{Al z%Y;L_AxA&Tm~O?%zA8sLRvxgEbBcGLl0Dx#k>7ps6@(iy)8;B}Zs#J;C^&W#ee1e; zaPC3>=+BKW`0`;dE#<1b@hz+~xXVc-4fcBvZ?({+XKfFSa-dgjY*$1Lg!H4Vs9TQ2uFZ;{Ok(CSe03a}xze zJ68*16Gu`J3n!z$Zt;T74T3Iz{jFyLv}R)c@rICX&=XvWV*>c%1m2z>ay!{ zVt#*k-81_noEl0JZ4F?`R5q1JyZhbpBjR_-FqsKGjniOHjej|m7*=Hb0s3L_B9tW*A8 z#)>EqC>ar8v8;(AIyl%tLgq$cQ?7Gp0-Qid6dkUuM=Xo*P7l~`(iyBK=71F+4no`H z?4R#it8)8P0PdZhZW1cPEvi&OMM2uFO?A-v+B3G^Fdy#(o6Kj`Dpc7&8Op(Md>F+c z+PWPcPuMHj^ef;hFnuFidW^J*L{TmDp@QAz;e5|e<-9gl6x;}K^V)H~f-cV)Z%|>! z5w*}&2oiV%g*HfaowkQFI&V}<$R|EkP{N^@3P}yutKc^p>VJV)tPfV791FM6ekRPW zEAz0dvQe%SrvHg*A|K`CfH>5M!rwEwd-*lV)z$fDM_a%oU0&%U)#4tD+#uccx)8ir zzvoa++mA5U`wT|V4}w)mzBXgIogU_(!!aAIhiW!!MjYr1-0{Ox0UpXWULIh$_p;ar z5~(@~dQMoj^9t7`w{E$YnFH3EADHzy(mhA)y$M9_XQXkzuJ8rmsT9}UqtEQN~BR@OtMy?2XX3Kk7aG;oCDV=hj0x?dU^DBCQ|+{ z?bQt?A77=2XQ~$;KYLODgg)eKo<1j3=7zn4^zlT3T_Nwcnvf`uzzSBtlWVNlr-tJB z)W~gnm3N=zJ)$v=P|;LWu;Mhe4t;CwAK8D4Xa0?~Sbo@^dDd%4k~ zz$eSxhFTqsQKtJUjYYh!!&WcXC@;Wa8PbNfLxor%2WCTn_J&F7INYTfwd_yz0IkZj zRTo`~`q_;GE7sKWAE}AR4I%uRdQ*0XQh>Ya_L%4kO*ujs+Jd{GD72(1(ZGCjMOuX_3TN++!L$w30Mf+Y&D|#|+-O9{YYIMcc9!(pB8=|OcS<>qQ zJh62Zbk-j*{ntzoYV#)H4{p{<*_5m6eYfB-v3XP`D|Mo>;>o=lNASxq-s|Xq)vBbo zC~~3vGym%gZiaREj1>mBotNYW2AxT$UO%435CY&zX zf;FZJIq5RE2jFsY*uu%)lnS0L@}zsyY0wuXJCaOPLB4exHeN1Gees|IJxB2BvF|H& z#-1N7lTs+;@wX=UtT&hg)=fOb!otT%)&1VJpc~56zwD} z_1J=3l{UKk!7&`Y-;xi%9{Ln8CU+fvuaBw~S=HBM)1coSY&ZdLP)BGd=XICC+s2VJ zv6FWF|1hN~wlTSoG6p#r;}xx{o*o#T2l{;5=gG6P7_!e^ORd9;{eTt|{@@8MQ6(vr z_32Bynkn!r==Y1%sy_&JkfG$kgKX?S9g3cdahH*m_ZB(-1+&9VFL~Nh;axSermBNz zfImYk)Y*ji4h{KL5woApE0jn)9)M?b?4}GOON1w-ou`KqF@ZZMP1!L{cSfW~I*^c0 zB~v~yL79wVqm?`V5&DgNhCDV{-(iCr&>=5!!14!jt=yRR1v%`Iv7wqZ;&Ptmt_yON zn^@T5O;X(Z+qsrUx~SN1r{jFz$R%0czSY#XPwB_S0WD&8qZ+&adOLzcF^`7(-!kn^&jlH!Asj3sGLMq#tIxCs{e{YW~|A#eD&&$Ybo}C;fl^s$@;)3&}2@*DH zzM)q(x3`tmmJSlM0g}%QTWUA$j5c|rAF&S#6ujQ7vo&#jM7_Q=h961(Bil6YKr%AnLx6md-TJ?I@vfKRGgz15hj z>~LgVN5VHS50kFkhv~BA4DQXv8+>7T(UrV0pI$~qjU${5>z6rpy5-vRYzo}1{Vwf< zWG+;|xS?w7A_^B!Ls1Ryl7sK|V$#V&xr9ymZ=@ug%gM38$S#3vXe&zfE$xpdmE|bGe()h$AbK0ul=-fT$t9g$~^9luO-|_LFqYN$}Q(N zqOnGnttU@)siCm6vR^7va?Stk#!D1YZ zH_!t{kBvEG1@*PoSRWS^ik?RG+06b2mfS^|E^Rg3xEUs&o*g6L{Nk<2P3~PPxICcm zzL@1p3RS1LNU`Cju0}Q;{a2}aj*`@5?Q*9WIm^Nl;%pv>DvJL@8bsux>ZZD=5%#?G89&kKz#g~IY>MMD zFzvu0Qs4^rRQ#m5c#m|DbVQj(gSKe(ti*aH*FIqH4Ae4OFWxY%ijv|s&zS1_k@Y1+DK1>^7e1E4UzS9T;WS&^fW zM_w6X*+jSf+h`rO_HTalLMp#db~@xj-&2dxQWIM^xPO~hcS>5xWF^ZH^A|9Q?4=c- zDUR@qMZ!9S@AN7MKSjgd@IkF0Iv-ws!Tqw%#69r>EnWCs)R*Sk2WNVoQ)UxJXIP*0 z>xABq7q5IpEF+b+Gt97|f4eD3EbeIq1JbQg{bQOH`~L}!+<|~cS-eyjJ8zj$$cfuvtrt1 zT#yX_-0)Wa!n5=B!nfTl=J(5Fx!)&mDA~RS01yj{YGO>nh+KFr1*Hom84JdV89$G9 zCoa;1b|m)3h2YkGBSh4jB$s$U-knxj!{C^~>ILDu%Xx}e77t)7&%~kF+Old~7pSth zVw0}ZM=kuP)Jh|&tn;Gs#^%yq`Untzwi>-eSgGKV+qtliY?fMPtL-^XgdtDYyhv8b zH5glp4KIDCg%CVqwb3XWUPA{wLf$O~Cs3}(wp?^7$t(>Y2b#Fo18#P&p@j3SmrKKS25X)it(u3jTq;fD$-dXROm58J3VS0) z!PpJwM9XBRU2AZ_3EolOR2n88hNeSB7n5%=cH%?sR=$wTnfWnwWF@V^ReAM=8B}oM zW-&5dEXVvTj)N1WXo4@FV$|gw-8*M)3q=Yqym(RO{oKdcvQ)=wlwyZjCFqk?PrE)Z zf*a*pK@n`;xN}jeHqP3pmBV1+#l}rrB&lH$!U0%DWj!la!EM}zV@$}Z3Z@c^k$zUr zog#Nhuu`es*w*`P?qoL?NpfLJ7r&=XU#ion9X*8sZ~&c2=@^0}Px6#|8BT8(CZl|U zULMHL*#-wNZ*(2cG3%VxKz|kLYldA?C=5i2lG{1H^)B1SVi)DphSl9gMd?z$=JSoc zCQ%HBD%z%atI$VT#sreo8&G~v^w?>z;$OA^er$ci5Xj0g@tdY6$O^v}cpeH7*=-E_ZdCi9=#L zoO_2T@ZPLoG$5zyIX%5_Es5Hn#B$g_vuy1VvF^l{GJ|#b6AYVa@@epR7u7REVm?A_ z^J4}f?k!eN(69wI%z2H$(^n?>OK1WVWub6QrO&_v^2e{o4mtTW(iNna75F~V>K+W? z7D1(Lv=QNL>-fm9&^dmT!Z?9AG)e~oGHH~GAP5{mVAP8QxW8K{X+zGK{JLh)fo1z; z#>n>9aD&A&i5Gt15DCTExdbKtcMRr`*yh`l?%8I>PsJwtgMy25CRlACw2?z{a^%4B}rHegy zoRor+IEKQVBk88`(Yy(~pi`b%{DH!Z(I$o#(U zMt$M`!LV(Gv$$_KBeuuctRT<_kYQiWVQTUvh}1XC6u# za{5(NoThvPZ%S*7c+jFx(r{Wj6-foNGC>T?rpDx<){DE4{g)GaIgMvdOuWdD_tD<2 z81`|JwBoiJYPKM`EeRa4!X(8wQWH*jWjy>OCy$YshqMEF10xm8a#P1VM|6wlrPPJ+ zQw9p&?r;74TC2>g!Arzi9Ri`u@!)EVDX)@gK{d-K1QDpnmIg&TE2cVww#~j`<7t^? z8*0BK|MaS)919S$8`43BXrDS$;QBEvjZwa)!<`m}kyiXp+QBx9n}~+s2y5q)i=a)u zQXy;jQ+KH{%04@g9#b52X#%5@8u+`OJ7l&tl5R)U=JDYw^` z$KzBtzXYm!tETK;M z+hNe#{WPe{{$Ib{|3@!%!qx^(PBL}|#{YinRH=TZjw+7!K?kFW@>NtXSxZ#blIXKh z;hNUM7zr9{kVGu|f*Qx@w`BVEmQ{uMW}i}@wFm9)=J(w%rxwA=Qzs`BUUDBL*_&w< z-@r)Cy%3BqCpz!ir(0QGL8@%f)4rznl`tH!-h$yuL<-X`iKWUAB$grpZ|Kc)3!;P0 z{sKfXik{4Fd?XctUT--+Dbs~8xL$&T=Fk~G>rOa8Rmew6-Kn*t)HIdMz|L7tSEawr zasv2e8OsM{jp7zqIayCdS6t}4WQSQ)xt4CRPkJu`ZyKTunNfI~CPS3j%%)opXFyVY zW?3c?QyPpGF)Q>FK%Q$LwRmSO!p7WYIw7SX1|O&?L`E{u#XO**H_x(z%$9=3%2L3K z+M2BXTSsSl+EOeBBEq^-cOQ<~l(Yr4$V8g+@yY#j^tYTz)VR_S5n@L&S1Rla0?epr zIdU?0IV+&)&m=*9RzTSaZG`q=9(h38DeZile!8c7T}{uf2!vF@I37Ln#X32SuJS&i z+qb^U5>o~DBjt&76)FLg^gL6o#bOodJtwnS8#6Z8>N+5C06~TI5tL@QuyEVL_zVfB zF{aUh^6M0qnL!?EejnYKg=lKQ#IUg*i(1W?;zOL zDiQ}pj?c9}$^N06%?d`BN3JG_gaiokWSBqU?9d+Eov+l;lJ+i+;9AY+sVG{eX}Z>4WaAeLuT5Tx?iSJ;t?<#H+#J@#sNt0KD9d_H#~KHHZ*OKMu33U^6uc{faG4o4jiN}Y>^4go=L#0>hS3w7 z>gYNb&qi;NtfmQ>+4w;Nz&aWwa%Jvs(2~{yrUziAAWoZsXxsLK{r80>HDz??0lJz? zjKscL%8*JDyO!s%aEv`6J6pM>n9{h3pFrs+Bt&OW#}%`0U&*-GN{~Tzo&= z-+v;G3mWwm@pYj;2b_u_8aSR(_BA9ZZ$Mx~BkNwF7{=H1k6)39vk^QuwQcjYsBPJrV~D)e(bvAww!>h$P-*5{W)tC=hr$S?KHO9|AXAVkl*A_{+=4F!dxIYXB6ztR!D4ez70N#VN9)Hbz zH*_TU4m|!4XCi7B^2~Zg;(Cu444*-6_K7$Oe1L$o zD}>W%-woX1X+>lYhgFZPHE~^9u|2#Y!*41(M2=IkBg(C}+hKYh=6W}ivfS5U#624L z&uaKWUAtC-#eR28^nh_BbQv(-kXHr31TRUga+lHO3l8KqcUy5K`(3k&D zX|R}`<6rs_H3LTr14Gc7N8Q5NT+-Iq#GO>c&IRY!3DAea0l;gI=(N&_u9mB1h^K{bJ<)h*i9RY=C(wlDWALQtPhr$Dd*vbKW3Ea|1E&XEJt9eS?oV z2kf1z(SaEsk}l4XjF>#g!1n2aOKt>~$cG<*+RDA0`s35jK$>?Xs$0Z0SRJ&=a4U9n z5HlIWrySHybbM!K_X zdoqKo^6I{AbTjs69Qw0oAtKqUU%~hs^6AM`>s;&gw0a2VD0V4>cwo1Hl*a_BPJ?Z< zsexRBxt<74to~2&fb@zCI;i5O?yk22Vm)~2s}_J!JGx?_$w;=r?$$k%$mF&H!g3Ix zz9b374kcOY3yg|IX|n9?M+-*AuijjJX+>1qKUaL*E?cgYN`j`Z)J6o8DL?PJ0mG7V z>L)^qPp+-h%ECLn4c|l`=sCTQR3xz>N~67MW^!N{h94m@4MbV(Q6GP7LlC&npvhmVYKE< z$1&EYi|Bhk6fPI6o%PB9L7~p4oep1X&?Ez<)-sMG1nb7buiG1TnI%HDfv3%4#h#Ka z-K1D!vqP`Zv53+@(RJu>tA(`jWX!222SHN#*91XjD|GEqil|_#(EUeiwRW)ol22uR)J6Z<$qzf6=oAO)YqdRF&>k4&j6KZw?%hC_%;`HowJ{GXu$f`An zeU!_7$LpegKhp~&0xtqCQ6Lv?2kLbJjK+XA+Z7_5f)Y(#qM0& zVgqRy3dupN6IqD@+_7;nl;CYg01okgclX@9kwDT{oOcMlERi0tufl*O|0ueEI}$BF z9V?m^6%XH;p@#*QdpWm~&8r^K2oi1Pf!U%m-;dY0R}3KijB8TCz?w3Z={|z}+I$v_ zejwGZ$J*{;ZQtCZ9Tf|!em1D&8fD;^kyKnjrrNIWl{`p8M1SWhszV_dw=;ncX0i;x z?Y|*qjl^-s5l1~1P8U=@s~hZ@^sxoc%c>A{an%9FWl=E#N?nSg8cHV|QhW$rO)O zPCerySPfHBk!JBa8AAjkeTfNq;`4d}%LI93C0Z5N0fH*QmHR4P) zpNN!Kkm3c?P$Na^QZ|(Ja32!#y06R*wUh{j=o>%LLddj4b{^Y;u2<1(qVc#OSrO|b zfqenYBe{<{^rYb@ZWM{RWkP2{Tm94-E3E(&ydl9!=rRGJGXtUO`4_0wPD%Fspy-)4 zZ1?kzfALA#jQ@B8h)=5j(YUPr-^C|?W06iZn}4y$QrEuW<641S#y9P`2AB1fTCa|z zuee|y7IO;i@RFwrL_tdryVflmnn!GZu?Q>@;b&0^??NRD)mWsh*eAu%Ri5Ig?+aSU zJAs|`)8`YsEId39TOV(r+bk*eAv;YpiMp25ik2$Wvh9Z+(VepuVX7$c5xXRt_9~83 zE_{PY_Zw`ANiGLYDLwID$1Jm#MIA@)8dc+7<5O@A0+@7O<#jSbnQ=E8+Z!eYb^u2& z_BMvGJNwEA>6nI$+QnE^mnl_Y!hm5<3(ShnQbvH=LfB3}c&VSGa#jcohlKoLlcDqCg;bn*MKBCoy@ijF4PpWKC~n-tazB+L6G7o z7{5fkSm~E9oeUBBuxJ5YW*;1rNUQd)zuw|?~ z<4JpitIkbon~1ux!Zso}t_j>e9QTAB2`@SF%{=udh>Sa*O#r$RnhEuJd@$!>t;DOA zFk%zF;_E&r5NC3advbKm_VQ=58UOsAB<=>^aR%lkB_E%{;%Vd~VgsaDTl;0il-Se9 zxB;y@`ulu*3jJhER{S+b-_K-`O&TY&$H~T?dMkMKQ9Q*&7s(##$LDB;KEK_JG0r91 zQVJ7uJna-!P@uJZUE}T?p{~7qC;bRH$k6^)rx72`I5oq=cuWB0FvAjDKzTu7pMLFT zF>Dbv$DN(+8|rj2@f}kt^8?HD@N6HicQLGr-E z76=^Z0t_kuT!HfaFnIucyiwebeo`MCcdY7$JU{87HQo&0ALY*{_ddo12J8U>H?ICA zksr~|JctgJNaoBjH7J9ohbe?GlP3^Rqg!qRCti`*0{R;*5%WVasqDUM{dDWQ?BDi& zHkwC z@;B0`{2$5^1X|r>bx5@9&r0awbpdwTiukuPFQJ5Dr~)$UwH5U3lddTczva_PASD0t zJMU%b<|LvBW7kbIlf$QA6vp;z%TOz!;MIYIW zof`<(!@s1?T`TmHz|UiwVl{9*3qmwa>(g>Y-<#SfmX5#*KQ`=vPDRr#dyq-14L%0t zo5~)kYFwL%h+3wC#OrRINt1Ot=-FhqO~x}3bxPNu>?KdY=!SSLk&HGcnbYbcZE>Q3 z`6iNUPMNbvzQ5h-A&X*B?m(TYV-SHm#C?}5t2SbiQ-R$fhff+}_@Jy)HDet6AirNd zwTbHDWYN5G8kH!C6<4yr;0%irB468BkJ+z06})0gfe~B(8EWp&vUc<<)?@Yyr%5^q8*PL{j4#t-#tKFJELuMeCGcD-EEx=4 z7}u~02rz_(CQ(hC zbwciEEs}z!MlN>Ke&Itb%sf?ct8)2 zdY^zcA-2g+ls2+fUnNfO<9a{&IpaEWn>;p*7EDLllsim}Pz#RRl@sF!&n0sFj{Ie6 zQE=1EKEM~`)B?}C&lX`>V+uqd4VC9gc_oxLP2*0ZTXk`2^H36Xgg^-7{i7+UpRMgtU2IO%3pDT>N;ki={q~}yb`Xje)Vx!p# z<1Q>%xfY?Nh*p5!YSj1xIS6yF-@>aR;>@<5k8BBJ%jeP0oVZuo(3|B(9P6k7QhSY( zNI(4|E$tUbkTP+8emVX9d)H^o0mDy~EvMq20#C2BJ}omXgyXc78fgqmeB!pH@>3Dl z5f2b#xu|d->;Y+mHk$B83r|+Yr{D}QFxQl=yt9VG=Nb&}cnQp|8Pd2i#`9>LHwZIjoMoUw-?=(3;y)BRZ=C# zYWuhrK;s%4IA~g662&pYbBjk&>S0NCr?RFl_ghSyPDmoJyre!ded-lE-ezYsAsA7E z+i#)v2ZAx)FPVuJEKY2`x9fd$W|ay2$&A%*c2KA62#jGqH3#rUAP zrrMKgX8pYL8Twh;qP0(v_~^ODEu#bTe439c`qy)z%sM4xnlja4k&z)d!pf}Onm3{(K|$q2RYNP`h(jS3Jjt^r zO{-bhXVr5eM!SImJp?Aa^IyT}6op=Doans{U%R-Rn7cpT-XQfM5$kFgkBFmq5H7h> z-D*a*ts~qzkS(F?9zs=?zKX+2i)!sLwKdcFX?n3!->7do95lW^T#g4njOt~FX8Qb+5J#4E6*|#ttGldo?`USf>#6`LjLfZ@^xKln5cyDVa0BJ z4&K~xUr#u{A~TCnB&iD3wZLX{hN!ouejhHvh}ocxvp zBB)`SPWw+>ALqRRs$W(@-@=M_cOV&(b|ilef$rExK640jzav6zam;+Ur&Ml149 zb^}RQH{F4h!8rR~!&t&AMO~5uETk2(=gPsQwQyUpFLTt4iC75@#ab#hNbSOlP_43C z*5l*-M6ao8IFM^chCg^Y_TqXz8&lzvPLuFRJxlK&jNp)1&3-_RzyGW4jL(>U{3~_M z2kM`8@TUL8|M>sL+I{h_3I=i{K)JRzso26gA~PtUBWYZfh@w@RCs;xgl6M^^Mw{5T zuUi)ny@0>Lod$jgqDF-w@?-D$&AFSlQ&x)L&>}XZ@ojlKaiwsXxpu!l-DCAw=$N_h z!I~9*W*af6ha38TBPPSYtIJ1msyd^pDmVgN_@bry*-p)L_3XI|`$#s; zP3-W!tg#^jbsB}LT1MoD=oFX{rM33Bj#{9qOIC`=9uZ84Uz%o z+qejv7iNV$d%rV@t;y3}IJt6O!|8b5!?X}ie-|ATrmcg{mhZ)84%zGgMbC-<6 zK+Txd$K55#xKS%3Y4-HYdoc#UOU0b2KhE!YK!5DiXK=2e?l|K5g*z65y3s_}H7fdD zG41#uZa=MaX`j&ar1;*7vP;||B5nB777(pn1>_{j*b}g3C|GB^LOX;OSNVeK9k#~9z|eb^hU!G z0EL1{^snh>h}{c0z44K6L6tWoAlc_ntZM>;LM;TL+J`MnnMIsQu+0dpRwOv!SnawKB@&jLa7ANx8vqi-;ORVz~A zGcP(&wOaef0aD|?1<8LaT9ayLa{q>1O)c%qywI^qYPyu)u;$2tglh$uV4(soYar;Z zlC4uI?apHod;{TD!28qBo?@o#ldr)6q3Eb<*3%qY6PZ_;EGd`ES3kQywE(>U5mgGV zMFk>7spCoK@Y7D`2XjCTLZl3I2KQOTT8ri1XzFuL7@~S#6Q_02Gw!_k?1Nw9&2W*u zs245ACd269B6l<=eT!MJjTe3NkV3*1SVY`-qpNOYrx@)a6ye|jzd`^FGb8${Vk|NX z>7l{O0K6~18F{&@%CyZ5&8vv9gapn8uHT;2IoZ$9!zhj7>Sx5HYeNh%1;Q=U?NV5| zXkazJ+nRg86=SU-9_zbn~E23n08KI>88J!cxGtMm;&B|3M9y=6%0)~>$bCXy2u|+H7^TQ2j zqoubgxduvYO0u)m0Q{UTb(^SHc7}>C0f}zRs!2}X!8_~SuUuhCbEQ!#&kKf1N!HEB zoV=*p9(rS;!y*bc!>!WXn&o=E+5<%UbXQzO+GSk$7ci!-+xj1!+Y> z2QLPy)hU}m-u=tW$8f^M2@3*d=RfL$<^B%>^KWqM{J+h8Lwd={ko&~p(2k`N<0hR% zq-3NzB20rwJ$Z=ypzRL8)-B^#X)QmdU%VKokp5c^c@rgCo-A2GS~km8Cf}CZ)WrFp zr{@cvAL|pEL>iBLd zhQEG0>nD4~A6XmxVB)pmT6dJ=@o4PxabR`{&D~?1KL6}Di8Yjw!;EBt`6iv?&kmK3 zKUp(V<_&%U@F}ijbY@fOuklgilRuYi?A}2ezya3<)NUyQpG`TL-)vL^t@@_D>MBM7 z_l)=1bv@TLgNfo&t1jPR@>)c6Ek0r4XO6Bi*$4OXhR;Byw61OKn;1?W_Zz7uHqe31 z0j{D+A{t94v+^4Ac~8*h#le^dT2i_4*$YyRhmmv>qgA8Ac(S;p zE>isnuMX10>p##rQ7jy|;_l__k3NF)Ptn>pw}!fFVEGOG1}_W9)tmNp&E~G3g+KF0 zo^CVbl_gE8{w z2(}oj=9|Ro>+CUeF%FGQ4@aJevq6Le6AxrHn9xs7ZlH`%cvm3(jfF}OK+%w10!6|A zhTd2a*A}j&7BS>=t2P4#&NN_=y6++)tHo5Bj!7TCEZdZF&ENMj+AibzV`$Mn(io7# zVr|Gjg82;jSB)!C#Iqj)b*oJOIFbEFzSw_KjQkBcmGRQj;7p*z;MztjtH!SHiwS(@ zi1eEfq9v+|v?>+%**3#%wSp30wF45wXJAuqUJIt*f zVdAe(0BVsp;c+9PhnU8D=-}i(#P@-H$zOc&-t#L^*`&~Ww(J3O>R-y}<#Tb5%m7;# z_ynu-)?{sBUD%P;oioHA(6d@?k-t^^22Vjj$mqW>W9&heYSNwPo@(TW4_DfmIz}c_ zS5-HmkFL4T#Sy4e1szjK^^hRpf53WX$o_BBHn{j8u^C8h$_Jv#|Fzmw>;ETB{=bfZ z$=DegINLdrf~M{NsS*Miqe0;Y&K{&fb}qJm7yUGzIuZXvmC`ts6WKiE>lQ{8W|A zs%**Gb;1c?)fORm8xG7kk9EivygX1Yv-1Ru{Q!A0hE;S^+L_5Q+3!~hvDSB!IrKoW z)!NE@>v1=<{Uq;A2_VygGGBj_7_JwPM=#BQ)XsrHo6@Ue`^=Mz$7tPD4LU}FLQ^qG z2bR5+G>`Ei$N+0o5-MBE>UwaaA#OPiUz_4E{SG)7@}>lmQ(E={T1Z))gj@hjRWf1_ zDS%nq^=4;a7+Vt));0=!UBB*nhZHtP!CEq`WquP+Qi(FF8$g*XjZx#tlD zjNx60orhSMJjhZpHK{F(a9Qnt$Jfu=;ka}wt4tU4F4(9;I3@#9DHt_fnRjd+G4?}0tfo1v>p=cj~N#lm$NoUXEzX`}g%XnJm;e`ouJJpYru!dNtt)tZ%d^4^7C zt*L|f5m33cU39rL|78fxx(@-8hpAMb1Yh-MwV^fD3j0L0Vvlt7@Xn56UHabA=sH@Kzz^|4zu9DM1%kpVH{2m!5d3yD9~oQlUGA zoilqqB|ZL@cBsd&EVH=dnTka@Ynr0kN%_VnsCA55w^>Mi7<#oCIvR; zZimus<|7Rkb*%ZhP+FM$%0E=ubBvLXp1*SKqQ2qWNA>;-=dN|7I|Zs_f3jv3-&5a& z2pqTiPnQ!B;swRa=VO3Fw-22P1)!AR%<~w4&}7k+#-IQ}$_p zhk^N%p{+Bk8_~WIWyysSjqFIoRJ}<;LS*xC%lAbneTgb#J{weg$~-XUM$SZ=g#D6h z-NYO~rRoj>c{^H1pquFGo8BT7x~(=A0c8uYdG85nS(M2q>pC2rB2a|~saPpZB*V(y z#Jg%6)f;;lqlIX|4*CWM&|XH9hrCF1XyHds8C5c3P8K*qwqVd%!u})qtD>I*5lZfs z+<9JeyM=SMTIg*7S5_;0@*i}U6Q5>9zlfsK*aEWzcf5DF+T$(r@IQfktj#27y?O;d zawu{%XHdsZOSXWljY5NTmS;g__YC@ONH7`4xCPu3f~NQ8`Z=pFJfV|BdLiu+6aN=& z?--r=+GYJ##ZD@=ZQHh0v28mQ+pO45Dz8>)~N^Ws4#+kT{!&) z7bapGNi%z&xTD^jn*My%J;=NoxsDFnXinrM*P%do9YEx!0Ge zTu0l;DzkTXp{neBXTvyj>ljDjAVIb^+7f184BKsEi>cXxiKKoU8>}q+l)A4YIA3WX zYftgt;bnHOeE&260jOWd69FTm+;IQ&kx>4(e-6AV;!OSZqkDFIKbdLaQPAj&uKV^k!k<-`$+fdAfc=8 zdOaP*Y}^RpTIgbI#WCwJ!|{@XjqmgM{P9asb(}C_fJzee7x2Xdy|<4Txdf(o=BxKnntB(AFEt%KSz7fve$6AFSP-`ssY;GMI_{k{u?KiryZZaY=eb zX*&TV;}2`sd5c{b=AyD%&r$LH%v#AM7kx0uJQSF4O`}ZLSor1)jGW1$ z2`ji&73ApB4ZCh4&L>jci)Wu5f$8qfw??$sNqadoc^6EA$C4}CQ*X(F3-YscL?YN@ zs{oG_&9DQG<9cNu_qv|=;RAg4V`)a~p0H~W4aXfR`tx01&|}Qbgak3SZel5;JGZ@|~>Cus8Y9kM?|7#J{9!vM1e0m{_*7gs|%Aa zRU2iBORmPw@YXl-9o8_#wXbspfyzIO+o^OXP@r9FsPV?b*HwpWzj2w*jw0Z0&a#&?2b7# z`-FYom}B_kH*^ab`tSi>z`i69fdUFmW6Z{+Cj7H9+R5MJ=0ST<%> zMOfkpsFN{!rJAt~QOuILJua|_TlIYu=~czP(n+B+P8w8%FmU}~s5~Z?kiw)JQW!tD z(G^^Bx#1JUTOMhsNh{t$vk>Av@a2y$V!iOijZhcsUsYEkv=$S2WO#=;p5hS^9>Vkd zsdNlHiS+Pl?G=k@y`T6Tf|W_)=UYGX6{8yx({?(W5t_|DqpFudBNMw`Jiec4|Au^o z&P<|}G{0H=hRO{IDJ4OYNyJdLkRaxo{Tt{u-5*J!R-r+K0Ibx(|08$%pAK&PmwoI1 ziM9S0C8|`}_%ogUx#4vd-^_0%g%ax{IxaS*iXa@IcLWYHr?`rUqT4P(JL1CXdU~O4 za`Wq{O3r&4BPtp`+II3uj3cW9D~AFFdQZsZlIQWw=P+Z7!}WG)tLq(Z+uLiPnlh+1 z-J2v$zip%Gk$bAa^~KX50reT>IyIzfl+Lq*M-HkqFQIj5cl7qwGE4W~do#w06kW(B zg>R>E%y_7CYaNBgm~h1I-5EGloN3(yqjeP~aZ2-q6~3Q*AlZ%Di$F6mb;Rz5VplPd zpl{)Y+>*&@z0o@be8cz`O<8Tni_Gwb-W)7f^!Tq)TCyUjzBdL*hHJ3C=M?rd_7Od} z4h+(0%FJB5^;Vho5j~uGdTHEB(7vRllC^$};2WwhGVLOua5IT(Jsi0@^>Duj=~aDs zS=L5fjY0xhZP;fO*f1uMb+~C+(c^;*`g%d7P2+lD`dVh*TmS$($8;#4Lrj57uo8OV ze${@yFyHO;Q&zDicBt+9_@04uBZ>0SSgKXo72Y&Z__umt0|cj)1A*!u&%g})eQ0-e z^=^ZGU-Ny*fnw5Raa^_G=o1SJ3sl-Y$zHXcl4T=#A=}cxigyFEPdlau#03d zBXs+Wyyq*n3B@t;J50uxpqQeN58>JR&L0#W7t@ou-tn7rg}U^bA1Ifw^0?hPbTq_h zV9jYZ@K-ZaC2!)iklY1_=nB250;8z|=7w-egWQ-#*=-IIKE~{U!Nw9a2ps=G1HYVuM98 zNq#|S&5R;Ql)mxImcHL)i<3P{0k7xZTzVI?32S};Lwdlx&rL=8|1wv_ z{Gl&7*D9@-5y}d-JSyWVh1vP;94WmE?V(ddOp`%q&FGQDL_K?tJg9_Wv4Bo$#uwIP z|6m~6bcy}!T?#$EJyYFJef3ug>e%mxrav>IsQ*YZME^I9jD(eyvFU$^NUl^lRzwm& z_#j;(JAUTcYhe1ihhNNCxLEYT`d zfw=kXOx?Li%aELB6Ry4Aaqb%B-GR1?=0{EZ+BTq*Z`?-u5X|(PGua>rLv>5DVjTZn zCO2_t(!(&|l}pN_IgWO_w!>8^JXvwPGHQIpMmi2!wdiv#(S}zWL=%GX;GCm8G8Nz8 zWuWAw$l|G!I{OGgkp_)=(r9MZEaObCYAZEWzu&y_8}kBT6)Y>pEx}Vu-H7vcic2>p z^BhL%RUGcSY;!`&DR*K}7k&MGHyqk0RzUMH%hDsY&zkDU(Tk0=Btii-3*jDFU^L*wzSp z$@_N`qYaaxw`+FXKHr>EN2K3t38vc*NMjE39B^<97aM8dzJ||@%wUS(&aP_GNncG# z7$VII&fw;Q*i_n1Eg$U(nZ<0yaq`QQr6mtLDO4_$&q4Z9Ci6xOEoSsd7jEh5Hm_>M#^u!eqCJ$Cq7J$lRTALX5jxM zK_5GMX@~S+`LWq#f+|=Zw<})S{oEY{)FrvC4jeO4=qj30b4t@{h-Z%K9dNO#S-r&9 zTR_$Q1l1bq$-K`Q3N7Fpx9+DtR0G~rog(n`KLORsksxazSm#l zUO%h83kd=07ycjX_kT(v|Ff_DzkKKm<0fPQf%QY5`BW;x1Mu>1+{0h#Y}zq+Ao7Tb zg~N`3ol*poD`<{U6TDgAd4IqgpJDP55rBB4{**QKnH&GSKYs@8hJ-_RfN>9|0cu0U z;e~)DP)boevKY=67Y>Xn^EjiTC}@d!&CB(&Ni-o}?oFFTsdUfarnf?JkPwwLZiY;> zvRFV{?T6t?)`b_EIUwk{23j#$Zuk+7hB4voI6?%yOtk+A(}skT8*~S{lRJNOO?DBi z<+71H<9C*Y$5KFFg@&~QyL!HSPKDAcp*sgQuywX;cg8`mp$L2)p@FbUAf-DoG(z2b zO#X4$8Q!-jH2m@Quy_i&MSq3_H}nOuiVR2djRs=JgmRJ(1M(ouZ)-PYFe%cGp|CYD z^IIUYAAP`ntYP6$T9irkhdvv<={p9xNev`8bfXJusq&x+#O*_t(d;6vMm7anwbiL= z2B?vBecEXIU%zN-p60YRfIk}kBY#x-A1bn#v5m2Vx#6F|2NAcwu9N)DAC=5a0RfE8 z4#vcCCZguXR{sG!0-Pn18o*gXP-Cfm6QRyg#ji)`uC%@`Bu~1@TLv-npI5K6iHFwK za``y{hV?1=3F55rlY;4e_2);4YM~<&EkVhR((%TK32adYmrw^7~mI5=stghNlYqt`B|fdYm3U>Vd*L3j&}5` zFEd!xFUu9(LL9;@uAzIv1HY(pNu_~Is7 zq)yBg)W+NFojC*Ti2Wj}dpwLeC|LIE-ZtDwG^Pl?tKv9uUF{i1k_JI5DB^2t_Z*n8 zf`sUX&-WZ>H6(R&qiUn4K_427hq51?#ZX%8533MfTM*pePm_WR_>n;UOrs#;YBEr! zbk%O#U7%Z-xs@(TJk)Ybc`U=xLB^j zk&cb($u$PfZ%*dNF5>5Y8li=zo(KJPaXlKER`DI;Dd6~BARXFkO&bS~lYukZQXm+w zG9WKfg=RQ3=fXR5B^+z{biA58ztlaT$<&6oiJ60sg(%h*!o}sd*-x{%((sFJ&0t7C z#rID0q@{@)+J)b^$KTD9h==xZbgK7C;7)nsy0yJB`K3|34X(V$I(#*We7A_F{V3oV z%1g`?S%D12-aCQsYqc9!cyj^IpOkKoD=eJ`MhTrdFs#jDFylLb%pOg@Ls-ZLHu&CN z6DJshEQNQel`0F%P`i$BSac!Y z>1W60V1DjLHmTyfaV?n@YaVn?H0@Fh-4QW@c}J!m6`lCOXT*01 zIB4%BLFN1e2$RVy`0#%K+tcJ~PA|^)JjUt2SxX&po^9OYRj}H zSuzA2s>vP1m=?4bbJ99Gs88WFyQI6n$!IkR%NtkL*t7!ET9yXZRs#sC3hC1x{xYEp znb+P-023Mo^G{sN>fb0{GR973wnoGvZidEof0nNQDBb_Rc>OOQFTe}5BNhwt2lCp= z^2%V5xuT>We;e{p(MF=;Y&@bk(xEDu{T}o99prhHLAh1EKArT0+)gHM5V#4x7B2c` z>W&x#wzZZWkDobHR-Qpa@_dUpT=DpW9?QQhXuPhFA zM83u;HR7I{riRD#@<<_QLwEDfRZo$$B7Kd9aBbd8_-(~w*U~j6RC-XwSbl8CuIqUg z9-s~;*|vg8gAqq2BHaj%oqvy)6`C4Hp9F$4W*vOZ`PrJkL>)E^Yiwb#O%$vcQnqLZ6(5;&*MP8(xZ}Q?e{G z7v*)-8mE-Ps}6FZl*pgxJ>QY`o|gN$c^R%s!$8-KmpwU5?;i)R*XBRV^LB8~=X5!OTh~zD13+LUk&nm>?J{2~{nWb*Z^f3)FF@ABn{Ks_k}Ld|FRU^&HhPE=e9 zUqD*U^zY&K8AFnYD%47S)1mgOUbq~Xv2#D7RE^=4y20mRqnaw9t4yk~PLTCyf78qI zYl@jA7p*4EdmY{yj=_i?w?%U|z>{BbOP`n?afx=MvK%7}UO`RhlD%UwcS_Wi>LaO< z@4Nom54+{IiOtAQLNh~3QNpBd7uqA|pi|2B2_5|_>nFVz<~a+{`8fUKkjnoB0g=~t z(6=^r`uoiMKM2Uwe<2`TC^?cw2Zw{+?Ir8# z2_x89Qxq<&4#3!#_iBD&oUs%NHy_=SBgO@}VoX*-%!=C;oeLeQ)iG>i$T zr_c;IV?#kVp^G*?um;+I%LHqvK%TR5YB2Ab)a~Jd_+4T~V#;Jx@f{Ld6{9V>N3x53 z+lrGsaS!&epWdEpgE=0^p+LV;DeX4_JZkR1**+C;Xu@(|T;9lIwvhU-IUJHvxFp{|)$kZo ze3~E^Nr_wmXb9Gx+twgAZ}nAf)E^Cb1%!i4&R1{0Xf>=?4tnpzojf?cTm+@FE7GG9J;0|iM*d)~kUra2|VL}D6g^h<9H1HW87F{xEy~Tv0k51J%dyoqgGHRW#6^DtQ zM3)J2 zG>uCHcA6YBqgd)~x$AV0J zb6lbMA6lhv(CWu(Fz>>%2&BiB)N$`%e+vlRE(!imj6VXRbNWX>ZVIz|aPd_>V2=sB zUf}g6-zI$`YR+7Fa-PX@+yMdt^hZE|0RobyVpIA?#CY6yBV?o)Qb<&hQu-MSv0wE@ z#t0CQmkxzOc%*K*5=}7M6=bbGJ+^s@-hv7Jj315B@^sP-Qen@NrbEdTk+ZHi-z_fX zx4$pXPffc=?B>Wm;BeqYDu5Tc@+CZ#1~W_Jr1 zRB+HK;Pr+t?E33!yh|-CU-o~iAlCo>7DUk);HUoTKmNG~QQi8p7yZG?`)KeeC^H+J z4CMEqft~&URM=%lQ4luAyc{NxhkqY-?`~<^au(Fa6ZkBJ0DmQ%eWM5owEOisc%HAo z7tG*c*S|(_UbNVv!IjIAYir!6jmt6Sa znW5|CpeM{jUh_}_KNGuaBI1l-_nvw`D=hhT*po?o3iL&Sv_Vm-8fH<@Vzb}`Ws}SEa6YV z%8FY?%jBl8yln$|G=Vrhb`=Ck>N1UMgsc1KKbRAurVo2iV+!KHCC8?R>>RWa;u(3R zb!1sa&~ zVx@rNx900nM7Vdvw8i643)vG%6Y5e+^u6^XB}P0xt7YuWd*s!xqiQlH*R$M82Bl#U zb9OBqTP>-?P-Vl=#RSgF8ckm(yRS2G@%`ewr$fT+uf#u=Jb)V?eyvybiFN81)jiId zp4E*fJnH9Y)gSkZO2Lud1qNqX*E{OWktv>F9(x3;YTeX$?Yxq3e&@)9@5^MDx7`y8 zuABNYW_MmqWm;k?h}mb+xX+};vrk~6K6&!AmJ{iEj6jw`pvKBpJM697U*l;U&G^1I zu4Ec~Of;5g|KeMXUN+T3hJqUx?j$xEH6x{#-Z5sUPkbXh#(&aT9FMrzJZSp6wBXPJa54-=--tQeDTY(kB0{Y{`K5xL4?O%Sy38dU0~M)8=&Y!R!(MdF?r1?lMdV8~Pp**%n9 zdS?WH@pb{ZS|F$`gS5f9*Saex*{{dLISdxR3`~AFpW;`M3?jJ&RfE@@ikRmw1HaA zv%zY2Pndyq4?K z1aOT(e}GEN{$romDcb8+vD0j?51Okn^GZ^39L2?39DCOUcZBeOy0Ob0E%q!*YOB z_#q2GC%dXzpz?sM7gRy=4yqu|Hrb{8TI>>tSX(n@I*{Uf6Fe4&6*di!A0W=wOce03 zYEcq6-EC7OnN~qKn>1nhFp<*oX^yHcl+$WrW|mD9w%08IbNV)Z9V)0Gyl~}{$n7N4 ziX2q2Wda0LZesX~yPy{f_1fg@)H$dtI7J7RwrID>ktms1T|-e372W3=R@|jLDt5|x zXy7bR2dO5LE0g|rN8TRFMxeCq2F6KfQi3@hCx~_4HSM9?o(|(v1!q%`t45^pi3c=x zO$LZ$Zqlp z>?mt-XqAcKd#MJkGjwZlJSY4PuL(xNnzg(xD?(+?mXRDSM*A?XbLX^ntxb#;w`mE} z4$xuiU|M+)+%#XULext)t53&%y|#UG+Rf_TrrJwswf%CB?@!8YRCl{h+fn(1KCxU> zYN`cqLxinhWVBS;X9aRT3&N+Bo)!G9eiUUO&a_FG*jnnYm-dx>ayP@uI>tOsYQ=nl zp}rpD?uH!oZE^_r<6zRDF`rb&UEv+?GQ^9)pUAD(RM5J&R}Vck#k3z6dxjB%CnX~D z_!LPzBs*I3*GcO^=WL_tt1RRj(o5q`rk)$wc8gE#{tE|&eM7~X6R3EWOG?e)XTyk=GW+Pot3<^NE6h$m2B>Mj8gTCbbNp%#$>m$XvvUejjz3x z740%e<%DBo!~Ak)kb7hQ1r@Y~GlSIE1WA|dH2h6%A4_5?K~((tZu@d+-v&`6_9Et& zK7MC(&rcSwJ0PLLovSI_Wu}kDJY0F(Je^G8x-`Ki&LCTMyn6zAe+9)PwGkBy@hA7* zrMQRwPyZL}Jw5~YxYJOtJvQl&uw{!I4x37km&~Kyd%a?~;~WpX$`c`{c$ZR4S1Hdn zXZfP^Wa+)e;-vsN2B8-kzK^xTEgCqGi|xAZp$L!!f0|RXwC`evFy0+qVAc&ssgbbr z&y1!TK&I->A{k>}Wi{W_j(Anu`qS0|NvP0HkibSL`Yfq-jhpJqRSbB_4AgSVw52Ft5L!yQm}!Hw$%g{ zYbKiak0qr59{{NW9em(xCqC71(dntGU0#WJIosZ~NIL*|D=dWX;HdX_ckNw5rPZX9 zJ%J@Ohvl1gpM{tYx&XaEAQMH1WMkSouC#xuoWN*Uo0E_l;J03RBsQ zhuT!+uZ$cVDRJ&obTFO+B2!5=IRX&a+SSR_b2aPkj*LzCxATjTTAPN$kr_==k!2Z+ z(Ae(go~rI>?Aifbuu(ubZT|l3>5Ly z)2~G+G;ele@vALVz10#lbtmSRk?BDnVrb0GZ_`VS0HL({g<0IA6K7lzf*B9wj0|#t zBN}Qy_Ve~FZ}g7Gq_xqQ=_Or4VF=Ww5FTpa$B&i)3<3@pd4`QzKn`M=*P8dX2mA(P znOojY`1xuNKE?5ICW{@IDN<-3awz!LDv6(!%+&)!5{71iil*PC=j`dNJLi?Pt542j zcj!t7E9Aa3Y<-kwQbwdWR|_1gk_&L#aK$YnW*Zs^<`8L-X)tN9n8krDo-?=JHX`lm z(cn<~)UpJ#We4kk?)?z~jnmQZ!T_}tB^FFdTvad-JUE^v;=0 zDmjs;fe9l^i8Iu~CvY6q+=E1xTI2_(kzq0Y(*u0-_o_r`L?f)1?5!5t{iTkjX_HG% ziX}m0(feOJU$d9=En)y3zx$6o-s0aVZGXHkv4jl(q?za&8vnBsR@nl;Gz0*RZ&_{u z(0C;PjrRo5_>RQJdJ>XYQrX?@H#5Xu>1@g^ipEh9v-ou?#r+!IADIJtxcNil$u}u;0xkEN;g)(Ug0N6GP0$ytF}R2~ zO{$aodF6m6^p=tkXAJ)MVAM^0_9jAcqK=Kp+!F69qKjktTDy=%+K`!OD~hTFarI`Y z)bv*q3_va|fTM9~Fe7bUHizh=H=9^QfXPm!J0jN3!Jjx?|Au((R92i~;--d2^Dv14 zkoXs5ry7E!WpTJP!qtO`AIzp$xkCXwxDrH|^w6d%BKNS)>Rb2;EDJOQ_q&hJ1_t~5WOwIO=<~y}TX0}YmkSgt^PD3e^!lwZHdm90DF!Zln+@wM zwsbwrI+!ucMrv3w3o_WF_h^-aA-(pY2`+=yON<-9BG=e^;0jYRYGExG{)N#1#(3hw zEz>nk`7oe6aXNYW*i!7ij(ZNxtSqCh#$V+&c+qESugCE{HGb`q+ zA+#pzVvRz#kQEl-*<(yjt&#@!8dxBu{g>B{vp*JS5`DGe2r_0F`*({3cCpo4;t9h* zO!*S!F5q&nm^fQ;%pPR#D3U>+Ay7;?XSE%Xc8~(1fWZ>&UQ3>eBwW>+8=7VKVP#)o z7ZAKpV0HSrXBg6(72fIHtv@K<;SY+>_?nq-H$mB?_>S3frf{#e&nT8;SfNttoAd|8 zLp$7YiS9||kKz{oz*A^~*{r2#2=37-nG2Li?<4+djcZuUyirx~yDg?I86$Ge71rIN z34r3Q{-Ah)j?{)@1kx*@C|%Nbsyp8#(YbuqDn$TEn?O2rUnk}eqoSK7tt$9K(mwX~ z+oipKf1~sT`qLMEn^yRh0r1Es|LBoT|J~xD)}rIl1>Uxg-k0Z1ZI{QzTY$v=ZqH`zz#t1q_jyV7U{~vmCi|Y? zAva5LU`vyG>H&eX;j_dXW55x)%nDeWfvtTD_ z()<#JjaqF`){03rYA-9OcLha~x|E9s;p%SX4`!qZ06$~>o1Y z5dytS_c_8l2s$C>DI?Z@!()_YeeTQp*-37|7vH84JUU1cd=r~pc?EdFQ_YU)0!G+S zs7`Eazu2oX0w0rKg-IAjlbXHa`5+q&dVQmsw7Zc7(6euA0D4C7|I)KxYDd&;$|-;7 zS#;pMq|x*PfS$3u^88wj`a{pK1ZLw#aZ=+RDN5h)%_AnVX0>w*yNE@mqaB^{Q-QJQ zxKg`Sz@4=Ww?AK9=2+8$Jin^p*mgMUJ{7dy_}hf+$YPf?0p>$8`=icuB{WuQVUfX*cgPpc7__d+9Wf+Okos{z$Az!hwa|^>M_jg z{E(q!AVfL#QBKQ8tKxM`*?AM+4@>r&=aC~3=+=DypuB7-2?p_#n8nGRYm>%kWn>Ec zNqGuqqt}!8TLc_$4@oIIWw?YZlx|~Dlca1bLOD$|(%S1p4}*EVzpO^fnEiIDy}5^| zlc+=(hD5ww#Lj(Mqi57OVU)c1`#dSV#OfZg_7FNtj&dc>*K*#0WyAPEJO521P-LGT z1is^Z}Td&a;oAeqkV_(l~E8;OI-og!bntXda6Y^Nx`eCCm+Brom zOxzb%*@iVe8%&1}AIe_M=8v8^Q6h`+^k+=**zhot8d894rVanVv!OrmtQZmi&m;iw zY)HesRa0hSiSJVLH#xcA|KgGw z)YbqK=jflAo2+3JG=((vdMKe9{;>`Uv_XP2py9dvO5q2DR`GMS#&w#k>4MW;V!F^o zi#1HqDd46V_VZ%ij)UNzP(xcQ+Ox4>MfB+*XB=A`TaR2@?-_45TTNSE*?&xd&L%r4 zt<+N06?%1MXw+LXv1scgrf^7P#5sD5I3XPtkl+v%FAm|gMrS!%li4r2Fb=jCwvmXD z(oU4hzzS|h*x}1rL6BDRQI-!d)uuW|iY!%ES{#|bX4NAq)taS~*v62R-0#Hc`(4Z5 z%}*0fe@NSW`gayUpKX4r2b0lzl|p9`2Ce_0xqWn6R!%@Wt!*oYuVWp~pN=Qy=ap(6 zms+iLJbuhkT0+5Li#%dI1Dp=p*r}()53dp;ZLYv+SfoR(N;NGrHNWuy521_8lm*p&aNZSYl)_8>oS0eRmWXYEf|0&)csA_*ibry=(NiBkjQ(Kr>Jj zc9q|TWRKyQ+o`6+AdNDEp2qDZYosF+sQ+r^>Xp!s{j{`)2};>QvNK;x<6E_^h|#5 zPTNN$S(Qak-ifAP4e&JCefokoI2}%Ox15G2iX%oxWopKb+Gmd)Mii7wo@OVQGtgl< zos^KfIi)O}z#Gv0F2F}xWHV9BSY@bw+vkbtaSU~~_JfG-M|s2{3g~=n zBxfobQkayKX)Zs(a1W>sRw1*26MKk#QuG>kasVA`(5@x=us2M}5QraIcF$k3I|kH- ztzRxlbndvsI#cV8k}FNW25mxn-Y%m73FNj>BeNEJ-5rn?VXYE&-x z5~!#ShIi#Dm^_=I*$|DNOqLX7ObL4H{MWR6gF0cpO`XFWy9mzc0QQ13)o2FC7RG$8 z;4GGaHGH_^$9fLG-oc7Zd8Mij0}Jyl30Fh$?(LvWbh2qTobO2tq+8-1v}6$j{kgdT zK%apbygMAU++x*{X}EBuQ+_O`@bLBrvdaT?9|GS1PQ_b5OyOXnAFF|SZ6Rs&44%f& zC5sxzyl=Nqaaht+gQWO`&PA4uYUG6O!UMN-79%SlQchjfB$=5;_`^H z*@5mUsVc#x14J{f^AEmc$YaD~*60up(dj%Lu!3Z9??98uACvn~(WGkjUM`@0a`rbh zAy+@PWcK;@!Rv*6gvIvBxc4>IQ+gm|?IUYvV&XM-Xky#K_V{m1g|oNcQkJFXN%LgA z0`4A{TQYq7rN*+}SnqbE?IeHI;@?oU5_aih4RsD*9>u)vWG+f&`B->ksByP^l_uz` z8OQsafWrLhQ*7U0pju+j@(g>_AKCyJR0NKY+O%$vtO@61K9hHhk+E-}Q__J#PSr+$)|`FxY^u zRz%p;p|Yl)hvKV3w1EvIs@4PV?Gs3>-`_lyi~B{ld0MA8QztZWQEo&S8?ehsV>U9@ zaHXGi9jY7h9Yz1krrt%pV`G?BWrlNoe}~ou@y5Uks%S@uA>EMm{^{O}%cM*Fz)#S% zYgNs}6}}(Z*hm>2!1o52-P^~!ouFXVDSN!5=VV>FNE1)vSZjY@_WtGad!7@(ykh?G zviJXVTj;-i|M(Buefsyd5Mt{Z0(s&MVxn?*{lT{!{Fr2@L^cXNBq$LCwh`;^tsAiE zun1l^H-2(nQPDoL*IbhjkuLMLoO{{3csoyRZRQC@BEShgW|J$9Q}3BWJcsLRT_4W} zY+ur^3cGzYJ!+JD5=y;Dl|qeihQdjpzq|WOpYn1T?bH0ao8EK2hFRGDI#&Dv|k zwObG5u)@;WOu`K8-r5++R=DQmc3RiTFew! zKNXd3b29|>54>>9-wp`yRuF=3aOV|V@%h!+l!TUintw!|(TvQ+0nFy}r@K%G0FBV69}tsm+U2M}M9q-T8- zhvjO-tetCh75i8C2n9cqq>gGfTMeIbc73CT0-JSHlf1?~k%I;57^1R16`J@7$%D_A z<5u(V5{OZQ`&hN+6e<^7xzd!e&$IS27gUhEnM7;{EessSa~S75A)j~Qx;>S=Jr$Eh zM<9q~#WiI;!p>+m z(eirtPD1s&GD!2wne?o?-mNo>lUTAjxmG~br&DWL94BZjTg0ALS%taMHyW__oEQtV z_H(}z446qajIO*a!@11+(%ck4dj}GNM(6Yh9F~i2ecB}Qf{|o5WyXMuNQ7w4##Xkm zd#RbrJu~0Lz7%RADAJ5y#yo4wwMH=)r2Q=Sn~V-?$SmNb&_#HA57d<)gqnTEfuEUU z2;K;QuQ}xP@GY=Hy|{73rMUYR=mZ`0Le5)Ajd<3>i;e$o6>rq_>5LF!_We8hjt`;U z4tg})>}XA=vn5_mwlDA_Wu%r!fKE5}dzvjVrd1zBFnBhXj3YN{pgkDfw@xGVN?2Lq z1NxS_P&6TIQdykiyl8Ott(phkNX3j}#SEEo%)8UbTd%fVeeM+Vga<2SFA zNIFVU8hi$2=GLy%rCYGX?~pw+#8#uSfc9i*d~m+@T$5! zvVzb4GKS>sfy?hwCg?%!Pdw- zidmEbxrC|$pTxWG4&^6A>M|ECFJSd?jR_W7mpNXnEe-v;a?fD1QTwd+y4xevUOP(f zx_|IQl(%S$03a?>_aC2a{#R^M!p6|{&n0drV`W=QW1IhQ#!1-R!PwC0KMQW@Nct-_ za_F--5spSmv&FrKt2{Z6+6_1`76QUxQL0|BcdZ`B&VI$(q-pS_Qkq^A&+7)VE8+S~ z@c_|)@@w77#!n`uF2~=#lan@|Z!fUj=tXm8Lk%#B%~_(jY@7<+vHS{p>f59QD4q5| zj>_GHq3#W&r#9mB$=q_s9BN>GP#~g^9TDL)vW4>{rDB&tG*r32KnEdONPg|wE^48a z#eb^012th>Rb%%jm>B0kP&F0{majvowCGf_R-|3FsRnxVz}6iva*qeO|FF3Lm9u}F zi#`lw3S8)gd`8zGB|dzkv?Vg-%JNX%qNdW0H%_71Xw;3nsGXOcx5Z3|D+)aG|8sL8*UkM9BR3s;|IVui@%1Z|{GB;9>Qg`)%j9iu{Z$jgyz`thS&}OgXxg+iF^P z2*N}_wR-b|UC8VHQ+41tRaX_2MNe4&#fuEaO6+BUADk1`Q4bIBBLgkHz8)ex#KI>5 zj}#`Te#@+8Q&tMwvTW*`*c9E~y7}?-YNyaS5OuE}w0dv9LX(V}msa>Uo$S!3z-uB@ zm56l9LTpIuppt1OmeK>#q0;BEsWp3yd7+^OD_P89sfHEgM}- z(57~9p_<>Ko-n%)NG)qdMp2shHO;U-{EdL9+PbBgsT<=^_#XHjeRDYAo+$ee(Ib~q zkM3^Tz}B;1|jJ}j|)Cny^Iu)=opFhhTAcvf4k$PEe@FHv?_I2uE$ zV<+80Jz1}OFt!>->xKAi^Q1uowQW~)qFo-py_TU__HCwK$JvNDEf`(F6od4S5d(BA znJ{@q>b1^Dr~wP&h$O{Q4RUZlwdoRYVs%ZMN)6fyZ6`}Ex5!;QS8uj7J@pZs*q9HJ z;C(0gJj436DmpaEQ;||skr^VH5FGYiO~lcKTN-1-S$gX21~(snL< zNFsNx{r0l}S>Bl{hdU?762ZY4oyMZy$!lcoDPN8X&YNK=<4#emC^5BD8#6IiNhMpI z9Um^DF-~>$k3OWlj&jusAz>!;j_W(E@0N*=v`6rzR{NOKbKLz!iTJMIsJp`Y*Oq@n zycZ9Hy+KFEXS|yS8M4Fm#}_fYWb$94TKWyIQl@WxS>x{$BhH4g%Dd)Kgrxr5!CVdZ z6$$oT8wC7In9hJlq(WwdJ!XhdMcq1uqiO|97-C7B6BkNwCNdrmNar(^ZcW2EDIt@Y zzav*>la_`oCJ@6;^U5?QGWr67zQ7@1UkHja0mb7A{!e27|5uAg#SVbJ|EuDe=LZyz zCw7xOR7Q6u{1b>W4_x6c5`O3nK2)h$V#qLbLdRzKz$~lvl$#F~5{v>8-;YbL!t6nI zO$9%#afxm%2QDtI*YuU2D;I~Cc)VZHdySabY0b<8b1`s^4#_RV_Y9zE^<(??o5umg z6Q;`^Cvd~^r+6a5v6zk=v&j0))r8|B*{hhGHWCW#&ju{;FFT`!^oM+g?E`YXC+ps$ zx|3?O?sO$%3{$@(6p}NfA;uZ0*KlK`7g|tDB{{TMfOTG`LEVRf7_L<+j0M$%*qnjH zD7@`OANC``lm`jj%yf;%W<88KMY@b#?+Y5|6ZeTII7rOtKR4Q?h#ZwXH!@Z_j81c& zhDZtE_fd51CSmOFfS8>*0E!3dAPs3Cew3+q+B}R+MI=2g4u@0V>`6IKA@~eV4l-#+ zz?-8&fcc>}zMf@}ujLjz#CSUEDQP;nE?Uz0lx}pp)s4i->}WQwPX@;j-PFxR-p7^9 zeZYRK5u&uHCCvjxkZy1n*xymQ|7UmLQU_qV7>iGi=0(N1J^Aj54Sxfq( zEj0lB9KCfLOTA2@$|-6^2M*I>*XZh+c@g>(4|db6AUj?v9M2Q*kl}^b5LY+o7Rg!aY-tj&5(^@!7<`| zILm^2o<@r5&wUGtD4*fjpN#>TpA(b$@L&u|>?vm)F{=L$ZEqD8*TQBAC%6=Dg$H+c z4-UbCySo$I6RdD|cemh9fWqB^ySrP^;X6J5-}9X5In(n@&jmO8l3nlGuPnjaKg48c zM#${vj9Zc(j&ml@p9xPDH`nUOB|IpimY;dV)e@3XLa8j4#>?>ubD+q7`>S|5=Pw=p z_r>#{jh*-p_X+>><@x)5K}}nE<}*-0o7UQx8ZK|^MX6zfV$J@OqdGe&LeG!KpK@vd zP(hva???Mts`c3^!vtKPdr2N&nplxYWbTWY7f$nE8P~hZ@wVTe|J8fpu9&-T3{6re zh-y+Vx-L>bc3MXyhdU-vwtV~}maxL?ChDogqZWwL2}t}YqQ46g7|Et{X;RaXHkS*^@CICLAa)w ze5I9ICkS|gghAwhxyYopHWZ^9%A%tcSx=*vNapYvCdn}@cRL=|jjf)XzG8YGUV-sD zcwztPK)XyFx2mE>_kK45qoFS!W#f~m^%go9d|TF5yRAoJby2Xrl=OA>nLzY9n>#=a z^ULTIOxX{;xrz*e!pUz)@d(Ez?kbQjsmH2j=3G?XTkMYA3ozG4MzXGBRejukMR_y{w z!{O8KsyOWDUin=c-ve_)HyPg5uz=LUN;0q8C(a;=nadq1%c@Vmo2i=v+0#2IR^W3p z4g_It4Woxo+{96(SPMD#k`pL`3Dk>F;&f*|foB>Ru9(E*Ul9u?qvY7B_GjFKV+3cX z02W6n14B{JK;>)h7hH28m0C%QQ6-oM>w-V{>{m_i?1Ih*!1yM=_`5+X@LIR>VrB`V zRvFPEopg=v`oQy7FV1hMSH{@=rFHj4N&Z!M{&NhEs<+5uimgNGjZ}r5L){}~98*c_ z#V7^tC$s>42fm;ot7P`DjrGZ{Urffs{j%>W3+_mU!O6mzl)~~@vs-rSvU!?(BJCMm zR@X3BdbxfDL)bpfur}(m+~lnH$Mm~KNUBA2Knmw=7e=sn&0v^j2uk+3bmCZQ0;RL39qs9<2Irms` z^4-sJy2~09dV9U3`eFP)6DF8pEy=Z(9F3B9BjslB!4evGC_?5EnkF?Q@4W&TC8qpz zU>QlOHyklDxv73{$E7J<#Of61QyWMqsbh|^o@9;g*Uem~>a>1MVKOP6o;ge%nE}v) zf6^J_HG+}Mla8z46g9rVsIn0l;_6IXn|4oTwhf(MB#cM)sdU${8-Gj4opH9DkZm9} z8`bXl$~=&hfy32Y&bMPY%^a9G)nbdN-OT}7L-Z%tlGZXg=fP&;DJtB+098rnn=q<7 zZ$4B38TSC21!1a^n5&L0X=N!zS#cm`v0lg+ce3D1UVTi9WzDh43@5;Kz(jVw$7j)m z1BZTk<<3^eG?J?`$Ji@ycx$q7UGJ@?on;(KprQG@rVnDf=$2j^pq`Gc>>Y0YC1@)} zxJJbwFYAQ`JhEe$(cy`}GbaD<>S zdDK@2(LPdn=9ALu#T41fpDOgi#wk8LnG7B4Dh@J1QKnch@~k?Rcq*+HUS%wHGmF2+ zDj?zw4e+G^#jbcLV6nQW9tX$Zm!D&w8fT;tXaQt=?jJj3{23RInQmS3&#Ed$4p^i9 zG{qcSc+wUxBCiUY<+CU?m3t%?@?W08gea}GU?o;@kBu{`XV9)9v@4;(tbUNhTNI>1 z&{O7JeeE6%pRMu4^3%%8bJEQ2?3RTzt_|bfdpz@D8U%=5eZPSwRC2e`^=HJf4~t`? z-5-i=|hKkGNZOk$xsD^m@qyy1w`&!uw2YtF}Cy*0Pivoc)YbOf%0C*{{1+bZdjq9pid(WFd(I zt_k-+HbltSd^pLdTmeUd%vdyXsaKFah&<{85rtujq;w8;p5+Hs{Zx22&ULMNSA56k5E2N|R))0AP`yGG;X+F1HeT394ntw>j zJFoc>s#0m5i6qM)InW2Y2aha(6IqJW_ zmr@?yhYz4iTroM%D1rA;AQT62f~+2TFoM)O@Lt|s28(*`ew57n=aaWP4nh6Ca6ww{ zL#C(Tk6vebAoqAQ>~=%Xn}(b}IF}Tv+WN3mdjI$>CW_^=O1qqR*h79VG1(FKW&Q)e z9HqfHf_&fdJHDc(7GKC)%$#8DGdKO)7GQ(w_p=Wj z(m%~OdjG}9tzz#WYwBuh^Dj2w-?3ZmR2g3!_-2c~u;cl8IDO7a5f2r8MAKRyvqDJ^ zAx#M?j6vg+axt!QK)1b3W#+BdciwkXG*dC9ku7RH<5Eb;oFKbHhb$Bq7B^#bRed#DF-Ybh{Ja+-SNBb8WkM z^inXOG~=^p)X(JJMw5fFb&UHUQ$+I-EhPS38#z{Ic^XORWL%j3*Fz$GbE(m03WT#E zI!Q*=Cd6rN3~0VUr|=#Fpwq5=9sP3N#P*S;h_9j9M0$eMe)_G6VhyFQl3mjHYZNf@_L$R zl`>7N`38nlElLuM!m)apSWDrFdV?9yi!LNx0w;iv$7N0tVcj&7XBj$mGQlRx2~-e=*|8C(BpZ z!c^XKmwbAZ_DEQQqqU+rim@xozR$4@I8GniywTX zs8&PTS+>vls^*-vO)xJ@ZTvzGR1DyX0(iD=1Xt1ZP`&?ChHH8p9zUeM zn_4y!fr9eW5Wsz+oR2@m2~5HrDp)i4dN<)wxGyUeJvy^}wo)JAt6_#4uZB?$yrb(k z59bu|irW??g0=rREhpwklvIA$xiRU(ZVl_MNlk6+b-dC~3L&{CE|P7E0{l+W-uK+h zqF1^Vb28U@kem>O<`^kmYNVdswa!z^p&M$XN-t88+TE0p7e@{HD+O@ga+7vs4iH7{c*g-%6o z%$*oPCR!_RIoF++Aj{^HU_mP@8;kb`9smm72$huTb;B$1Y?Z=$it)sk>Rm>ghE6NH zOAW-7(LM~-CGcAD|K?2$TI|Y^n5K?ok-k0dtEp`{pNw4?dhw5XK$g3nArM#xA>{7+ zf~2!`z3;xJqw{U@+D(CPZRSK(j+|8%Q4NnGe4xl(NoGWMZGgV_@&c?;IENh~nZRCl zz0U|#Ql6n-_@$>uGAZ>abk73}h|7@Pce`e(T8+KJH+uEZGqxvQpHC4_wHg?X< zV`I&_v#?C{Dv+wB>m)#ZiC9l+qhTa!O71B9@;#0Cuc%T7e+DUlWwXhBDnB1z9ozlr zg#P;X5AI7CM^;kFUitshGjmiFQ`Sw^5ga8KwU#XmTUO?4@5k7`H%CkXCm=EogZ@>PiP{Py5{};LkwT_0dg|b1ZscBV4+61e?mMtZf&=njbEWoGI%jD@N_3?i9ZwtWVrBee8a^ z#J>=kPL03(mBbg`X+M1S?#%`9{t5kGX9N6a-PZo2pWNSnV(QxO`cTYQ`3M3aWZEYU zMC_min3AF`q&`HqUI}r(+1Wh8IAem0(Smq*px3Yaci|M1Yb9+%#qZ90Nf(#w)FEcj zLD(R8=VZ|<+kXAN>(|@ME!Pi>hakfRR9D9qqwrlvMs;ayIb{V#l`x~IkcWci>LeFF zK{9}$rRGq!r-`=J947;EKl58!lYMBr8tDgc)H*sHskOC)uiglLnQo()7M&&X1tZ95 z8D?)`Y*OpDKxbZ68Ndgr>l-_pbB9Q*sNqHyC-~J<(=cVpPGozgXm{T~KavD}hgoNl z^Qt1215sRe!KmAt8W2SdUc;jlm0a~^&9LpY`{JV$J1VU>tfe(IC(An1J*g)-X+Z5_ z2Lrwq@d!86XGq?>lgEuwjb*a@Jw0ohi7+GHQf_$mQy`klOw%f8n{Zw)W-+Hj!m~Sc zg1)G?Y_gDa0F9~hLp(`G{GA!nbo%6PrBE_?@FPU{=7x+qq^KFyHNUwf^w^wQ5Wc%V zZ)uW@a%{B_7FnrnbqU(=Pc=Rtb$y)kLK?~k6C{nrIp?t|^2pk%@)5=k3x4)dj&0tW z1Bn^vvB?t|Kr*^Ls>b&;L-jl%!fsfg5^Dbt9L%LJq6qgGY9q0Q%KG(kRKl~3Zek^K zRZ{y^AO^;?#bEn{L*xPIC%$D&ES!Xcu&@v#E4#LQL{FTA>v*8-tZBrVFh)NxA)}ZM zKU0obEK@^Yhn+Aq;kkgq<@X@fzHNAsN$=Qwy}#Y)R|!DF=dhYePk=3QUY+R5P3D(b zGaK=SIIGeadR22KO}-$q=_U9eD^EG4d<0L20KhOMJCfmopTLTSI#)tP+5LD@j16>0 zO6UeKYUEX`z&?^}U5COhENq_x~!#HiPn&J|~vz{$ImPc_c zecm?BFM4iPW#*#0quPNtG@D;>(Rqvq_FKw`O6I`D9}tD+l~)pSN8G!>gRd=1BBzH3)EQW!}-Wok0?;t*CLTdZaNo=_0hrJd`96En! zwM`HD7#x>mQMgGkK5x*7^z6r``+aNLDI)l1C|whxJD1j<+z)2y(TgB>S>6=oz+EFf zit0i&StGj~KDOp4I+t%xsJoXR>_!J74U-(m&w`~qnyF|cB+N%(L~w_@Z>a<`WPuMq zAhEtB@>5gdc=-%?78pCZ5b_B}A$9cDq&M$!bDqQU?`}3C+vKSGGxCeKVmkuSd>KD1 z9*H(S*7)v-jvF=QV^Iv|rwTiAcSJ=Wcj@&D3gZ2UeEg|Me1{C;UohO)ZAASjIH21| zab;YKYqp>#TftR2NL6J+_3_EW=w|qU!DI@7@EvG&mdcsQX+F8SA~w*#q4A0H}@~*p5J^cHie| z6we4}6YA62ld3~|+@m=kcottSRG&6jf*ysNHjzTBZlbs$6kWs)@t?^hKAUj2;&7*O zXh*%+C&hK~XTqlQ$6^Hgj&0Pm z(}=s)Sg7P7Q+1$pUC*?n-pIIdLUq73qUfX?Ky^lQSudF!q|VVzmRqKz%4eB+RAMYX z%8XehO)-W5cDF4ZySQ~_ijD1L_j$65X7obJ4&H3t$jaFpj}2>e+TVZFiudCf;SL1H zbBB-tFdFuh+9EUw7z`n@6}z5EML}MbZ-(51XPX0;cWOCpD+&%e*Hz5^cpU0pzl3Tg zjJ2nV&cl)K3Bi#XK1X3$v3|7|rZyYy@Q51ZkYPUnuyG>N_;xU{SHL7|nacJ6=`eGQ zugbCg!7Esh8ewjES(A1;0fwGlL_TNa%&fpR!ZmFi716?2cH13FBzcPNbbic3kG#1M zZN)3G1FJHOmxz zeCHGY1o;AY+y0Py4cH_D{KtfqaVMoVxlMM_5!w8g8E;#P=$L(5NlQY&?Gt0gNdB9L zn|U>Brfz?em)i9{vQ-tJbJ2}wwteU;8|e5Zqqq&5l7?6MoIw_A_@*erl6PII_O9cv zG_R*&I%|pdb#~i7uCs;yZ>sulwObjZAOrr4+P6NNR>|?(s#1$TEx?o69sSbc5=AAU z@g}Rtcma>ov<_`c@_OT)0}+~@_etps%~{Wh*U3ftrqBD81d>}+#z4kE+aUPU(le$> z4N0@xmzvJ70QTL4$#z3)(}fADm0hVK3D{vccKAxhXdZSYaRJ=YE|WA^)Z1cHVAlJ=CQPkd}OeY(f`N?rZp(LY5}lSu}50q|hi5O5GIoJ(V>2lQ=jZYwbR3 z4Ul(_g2_H`f#aWGk=gJAnZ_)WM&rbGcP0D-6M9=$yq3QL0Z_3$6Yz!*|IQjs!S8Wns6f z$Mc&@+Tvs1{_WsU+LYo#|K4{Gy`Sg**L}CafAS5<8hU#CYZWDC>SXL_`Il=X`M>9J z{TtIu$<)c-#^qmzlH~ufe|dwdwmpU<<}0OZ`;aS%B}9=HaP0ERKS_-_zZgUHK7x%tQTWJiWPcSsq|gtH(Q%F=eMuFNhht`%*HeRjJu6z zINeSB^7Vl>z*|pw_^@l3QUWZ&Yc?Pazd|j#aaa6qgMq8V%51w)>qiF&Zc(!9f;=pX z)Kh1U_)UB{u;SWmwS4SHrP|gX(?*gAFvE>XLbglh!mYiw3rCKgEkt(%SAs4$-NB(7 zE0k`WEmXI>Xl4OXH%L0B%-Fs6{LTYf6=0`}4_bg5?1dvv}LOzk0qn_MU$+NKc2$ZQ(kUCCSswaKcc3sT;lyt`#< zCPY~Jm?#f0v6LTUpKB~wOup;}n=FSz1L_JLvv1YH?28qfl$E{UEN)!5ZqkgTk3t9^ zgKxzNeL>sSxd=N+3kjVCF-1VkR%F#nLa=ct;tvl9xzQ_JO73<4^7{1ps zjK)G*$^k2E35V4l5(2XnStkB(KAEzieN=K&k&wO>LKJpZWIe{*ndo#-JHo<`(CC;_ z`n6&arEAvw=yG4$8{F(Cx{?9ruaJ!3QEe^r=G!QD z{D-j3VQmxXglm;2p0!g1aSGNkL?V0bvE-uJpZ4N?uW>#gxTH zI*G8&h2`eYRP;+HRe4zt7HOTS)wll;u33K#aB}{G(jbm{OJ}9}bRa2GmJ3aP1ZuBm zIyG7c&}*lFP69rNK04cn&x#&P*7^?5Wt@yu_%<0CQlO>DmkukC=e&^5q|=VJyvmv`5;!qJyqy zfK-}-bNy(tAEspUSv@HgrI?w-tVM=we)SJqO8Zjw{M=fF3P2l~85%NuR6OhmO&;WT z4?PLc1w`$-8mQP*Z^it<=+jM>vR{p zD``6v@}W1?zX#){w!G9~n>LZbavgBg3tgkp>WcKZ#4$JYeS>Ii3uu@ck{@+^X?rk% z894Atl_KgZ#%wn9ekU4>-9U}WPnVb%J7SM-I%NnIzpY^lQg*P#28d_K>Ck`t{+E09 zRxR0X{5zH({UeD-|NjkAC|mxEEc!RBe+P=c0>q1&3XdJp3f`&JDksnyAJH1%Nd4nf zC_YQg;uN1s;WV`^tWuN;^||?M31js2!fvOB3Jt&Khbz6O3Ut|+dF_q*uD6Wx6t92x zeuXdqxT%OSqe=n;5aJLRX@Eutdr78kD;ze*RSsdQ#xh}m84sCe&)mH*e|6g5H%i-I z?LXhN1WfXP7U~Ug&j4VXBWkfj7tmn4E;``U1B{N+@kLl=-o2Y#&U}s0(J50MsRbng zt;vQPK?yLddzs-?G?K%hnN%{KzVZz!vkRHvcvXSBrS2>1+4oPV41jipew+e26 zv%^!(s9eHSCe33B^LLVMdMmjOB?+#EJdpv#qRFSl9EG_d8n3d=ha+1>Be>#e1?n^_ z-EQXiFT|&Iv#QJG*nN2;a6cyuBb$Q`pVKIF&3wI zY?;CC!x#!q}BH2jPYm)No#SrPE*2R>P^Q+}|QThB88cs4L|) zuh>EP1(w1Y?6jxYXnC+-*|NJ>7o*`iign?r4pt>B$l1lvD?_N3a$*@3-|#BAksjhq zOm8xT6}os%&O<3`>jtpm(|T#LMa#2c2mt0&_@8b+;Es8JKG4Nzb|dC)g)LH7@Is|z3*Ooim z1qC3vdj!F}U>GpApK2drw22h6)ff0Tk*iOrAHkft8vD`T=)?TMFvy>e1W@8 zg)1>s`$=9*m?ZP4esuY0`30udN?}CFfVM!{8IOyCNqQ>a6-*Ch!EjyK3If-+u@{b^rE zF9Dp13Fwt#g9DmnU@%c<4;oiZ){`yIp@m%w%=XZn_NxiucrqlC9;PQ9W zZ0~|;lqFmUL*$_}nd4t!5INfjYVm+Dun*ETFA-S)CTFaKYX}fPZ;|jjmVMY1KyPJo zAgeb(VY2=gA;dd?tWf^FKNEj{!T;<2Ozyu9b^rE8`~E*IFu6&(v!8}k&8PbiONavK zj~upWT8vYT35{yuq#5MFCWdYBUZqfpo?h2XlWw<#D7<8+2807#<{6h)2X)Ec!Iyk( zGNMLs$)(0-wNIyRog?SZ<4yZ~PuuJ3-mp2u#Nt!$%2Uow_rL<2-CZ$EDi(SsvMa|g zX&Gm|xEZItBs-Yx1qLc%+lnRJIO0^4m>JQeAR6cy1U*G&a85)B-O7|L42L z&L5}>PO$NEeMzNRo{dmSBH^EKk<`E(#ix)IVCyeu$4s660@FmO%&cQWK=|NRqA0qM z>OF?-QLIs68s?IN+lj!YEXhxHja;B4x<~?V{F#m2D}*H02CWrMlPMMpuL?5=suI^| zC3OVRDQ(|{gi4df!3UI{=6#n)(pE8r=_Cg%Pkf(zE97HhE)Esyb9kr3*gu}xjf&p+ zGG6;(Xc%9S6CTU-2$tfmR776$K-BOoE?dFKMwCtF^Sq8#!SD?xKCl3spw2uC&c1TXH%|-*9!riJ-A8Pt?DvkT{5o z!<&K@8_X$K3dd9_;5XZP{tU>Gy4-t+dYwvRDi%nsxq9-m<;A5!mbqh0GS zq_#5@=4F%`fCdRf+M4^PI}_9dc__Sf+l94+BF}tmRX+bzD$|IP^={S(j8~&lKAZ?G>$^eG zz|kS!urEA(OMUvxUi3>cdBp5gSs&|4C6{8wSv6OjYasYW-2@>Vijr;uHY1NcZkG`A zDU+fdXIb-ZZvSN@ODa~d`2-ps-Pr(L(Wc10j+=BrWIDcHUb{4~F-SFU2e3*uxCH@o zCmvEz>7II`QcDom$jDr5khUdw4UJll;EIuDZa*Z zat)z3>bf4D6(yA27!o&jTKS9~z`hiWbHC&e=0uHi`#SaGz9GILRqmfLl0#`(LP-M8 z1ny5fUdCIzCUkwDjt8j3xAN-3=-9t@Y0&I9UD93mjE(*euF3`|uD2Ex-ifVj*6@HyY} z3$B_8*u>xz;Fn-SiDWuDjRXp-uNVTwohVPInV14tl~&WI=uK6KzRFVM4$Gw#X~z{F z;2lcxu`h;EQquFpN*7Y*;mRmtS(BETs;GY9zA-$FD2le$?Ik@|-K*HuTb%t3;3EIj z{i%KstR&F@>~)PavQVR#Ns#*}t#lN_D0`z2F~ne3(x?>HBd`-Vl6`w@ZnCA+>!&jV z26U>eTBw>NV#@D8^A{akC0O61qB)AfF>Em=oYN$@prqwT)N zI8Eqx$K6w+|0Di}fW0lMiWvK-D*X;g@;+STlP}lm9PdY&%O{m*V4QxjW zE7FJrh;kraHVM&Fph%-Dcnkhm`sk^hcAGG2U0~s;ZpKc6|AKz%{Q7zzEln5$2&&dC z8o*Pe#`@T{^)9YKfXQqSu?V<+xvVsMGEp4~c>T2|N@tNVZ#(iFUnwYi&nRz?ghjE$G*3VI8O2MF-vI+;Pl#333K$6t`XI z*goa9h<-6(j#&!Yw~y7~3qSDQhr#d=e+PPNN3nK4 zE{}E`T;$iMH0AlhEZ$X4=a0$2M#gS-@EHW8frWOJ{KRAvL^2G>n9c*skh@+sxbnvc zfDduu0no?M00~jW+`Cs^T)UR{+=;1+D$-LAps^%OkYyzs*MIa%hf%mgx$S*Afba@5 zbfCCepo>&~zB{l!KRUKQvWl8vFcGhc-l3q}U;vF5YE0B%3fUKnbGa|>pT*~%8G0eY zHGg?ehxzu!vI>ImTNQ$0Em^Mtz2iRhGp63w?P78g!_%GuQe_b*)rWLx&DMSmk4@dC zN$uINyw_m-BeKl-Wt`mGXjH=x{{FU+pWByus-TBj8!eDP(30W8!yx9AdZ3M{iAH)` zai$(-xd3amC=UhBMPtZuGg_D2%GUaPlZAa$Gfy2#qwDLXZ$>BH)m_PtWzse9(?{5X!r4}$55pxSry^o89yi0)-hR;r{yf?BvV2h@t5V6*z>@w-?+@)d~ezWeI5es|%L z^la%eFL60nf64hKV);+fq+=;lPi(c~Rtx?gEQ&riFs66lYiBJE)Tb*%TFb|2U9Zdr zH<)wpvs$QNik+X{$Ro*MbiyR=05@~ZLgaGxVAZ{!!)BUUZLZJlFc4046A!O$@!$ME zUG&^5tq_lH{hFoFtiC(`qqK*@l^z+oR z$va{z?hBB@gr?=(lDo-3SChX8)C-#6G~1pv_&`74|7#ePhn=g`e%DBDVf@p)BKu$R zWs|jZa{k-btupDqi-Tv9s#Y1l3jfryA1t#~biIUtXn>pT@0XDK)Na505qsWtW)&}d zg8$Fn{)I4x{eyuw=OrEPgpE245=#R`y6c|J#Pj&uXsXQj=f`)I3g8M&EGB`3jKUar zNL}Qh+k=D)IT@HcvcpWaSroVoFmzjXR?+RD4@lTfmjFBBCivT4KbDztBfF80vP57< zuI_o(^*gQ5%#Wp6tJ#A7OrBx`UJhJbp=5bITlxj%fEyy@wx~W`RA%M0Kt)5)XQU0raT??UXh#WJ+a|2>92i%brPk@Y-}%f~&hGby!8JcH<`J(M~CSGC`AF!YUS+$)`Uk_1DbiI>%x}<;&l%UQjQfX0|~%N+2S|YM5n@w)X6Q|CD*Ov z7bVdzD_R{$^Y!fCxsV8b!Kk;!V+Xv1+9*JIc%|a6plpE=3%VU6;?f(uml9_SQYBp` z3Q(_*5!=C=whPEu4hF*+a>!Y`Mnm?*@hIp3x0|};y-PsLfsL6_ChnfjMsrtC`(S)S zNJ%Vq&n*9PnS>+14cNGaibR&EiS<#NGVhxq?&|!MvLH$Q;~Z$Qxamf?GjF@|p#OeO zahM{T;n|Ge=f?-$3_ZmF*IYN&+_?*P7kc`V`h@pHo%Qv&GamvmGL7z*B!Ycdgk?ST z)E$0XR~v>bK}+qp1sjPS%&DX1M<4WA8euetI~lUGuN--#%Z6K=e zcv9tpB05GQryV|C2~AYG7^VfH9NbPJJd)jX9IDoEx=prnVcAZssaX%Kue=Z#AdR15 z_%O<}G0%K5JlyN}xxU+ke@*-J^i;5^t%>*Lb${X)M6 zSB-xvEfzUc5SA-$DIl0xfZ)XPg1;cez}c$BTY8jjf5s(rG!NZfgImB9m$Iixq7t*Ye`HkYD)BPK+wL6C#+FA5Qd& zSD^aSJ|q1QNj^W+d{q2gcD4;VmKrdBK~=TWoKC8+3bxo?@NKh=ow0!Qs>{R4g(+B3y;I2UL; z%mL$`KEmM#SfPwhtew>5jfX=^n`$Kry3q}u3-b|RRRSqik6n+;**_I=5pyQXsXDdI zd9cVv9DUMxQS0RnR@7UaAZ2$=uw}*+vwu6Nj=Ol%rJcl~s7-cHJ4rV_3p8>0V+aSY zvsWFjv!9Dr776R?Gi-igL0(aA6a&)vM(Yn3qXD^%z02X8pK8%dxDf~{lTW8xPA36n zdns*L8fQ}hX z8xAFp6-^u0|Kr@%=Ih2#XeY^=XgFSoM&4(o5%lI+++PjDjTMiv4?(1UZ37IjNrc$y z1sc~ZPCRu(wg#1*OSPwWbgg$xxlx=k3mSbKYfdck2aZoh@LlE3b#sTUS$VO%l;6NB z>;bWlX3R>*1^9nFwlJtC*<2L2upY5k?CIa}y}tVrh31 zbqi$v%redrOH+l8i0S(wxK^oh(7cI6kLcJ1mDN*HMC-H*gmDfT_UuH--{4m2gdA6h&)+xwnukE`GP0e zc3Mvl3GXD9?i`&0|43L&oq z@n0gL_>UIZ|2vrbpHOY}-)3d>T4{iO?pHKAYkWHL&$EqrNO|6(NYIEz-PLR4$tH(p zT&pK@@1}>S>!%nfE)s@XX0z{Bh*Ml|p9Y+`MkFC5gojT~&N|E|{;aO^+^;yDzrN1b zWq)W7g*B`F5&UQqXrR3KMO{*nvyt(1(_qe+>KDnWSbp zjkU6zS8CmZ5(+FUsna;ZDP~YXK7&_kOQ^1_$~EHsL%Xy?ah6BYe|$pmSfaI0fJ8N( z*fgN75;KcCAXwyWu^YL9^?_^`6CzxwgD+f2{UULo@b^{Z%l3sS{bYP9wwE zpcneU+|3RIQy~oA#$sUdGwl6fc+TlJqvqKdR`Df4kx0V_ld2P>!BhW?RncHI}^(1o(ZWctd%%HhC6AP-E#w;Y%`T;8jmN)y)1B>I|M0i)(gAqO3; zpmMbIDH9KiMN!PE*gDjBhs zKN7#?5EglUM5Z-3^(_xY$G>0!AfF$MUKN?!9iVcj#OhH zg#3y|^hm$!#Q*D9wUjUi7u+JMsrHUeVLB~%bsvkXj2rfq$&6DxiF2!^4o|Mz9H9OR zi3c8}8Bn?48Jj(vBLtt|GJJ>DXV&5CJ2JSq9YK0MY&lCY_u_`XP?8=@ zsI6bh`(ky)F^jTfrrJB{vhuaJu*uK7UN@Uw0f&O(p zgMMo^DTad@b^fCdLn!ai>xg3$%d>G>0U}RfGg?rTx;0!d&PBZ;7oBq@NzBw)x8M3k z&WQKx!T!gCg&=zd7Vg>Y=(it5gb&#((7y-(BTb4-EZ;{0IExpyTC%ks0-w=?=z#FC*v>J=f7Ia%bf7T{depQ_{WW;*MD(~`R|rC>XtSp#)gh2e>Ix_ z^W(n(bKiTriJ|(Qp`B)y{@XEW!xS8b?E$ssW^qny<7c4z@rZ_x3p0!{ zb-|78=EtWqs=;Yq**{WUPHU1_Im%;Y*%9>imqU?}dl6*`E z|EzIt?#m8v#FB?yFa5M%-*b&& zhuGrcaA2cVZ)e@H4110MQdLu8ad?UbB^m>eYW2RNbj+$6KcR=;Mi$jCqzsA*AxR$LYdFPjThG>QYc@s&Tc@wHs*0PAYqcdW+34L?WnMs8g zVy?dBOi&%c`ldO49;g2lY0s48K_qX8giMIIERE^|UqCeDtw3j^`o-8ctG8wxi9lHbYJCfY7QKJ6c-*SN>qAr+=174)}&J>2q#P?ZWw zp2^o<84AHF5sF`geeI(+eU6wmh!{aV5$6y^rN8=b0p^L*NKqryp2v_0XHeit?tShF z#o?JV&Tqt|SAQ|w;}FmMe!e5@4$41m#!UX7BkbRx^nG$y#}~)+1qIrKkhEjb8kyP} z2SJ4-swI3)a4X3*5T;e7i#L%Q;gK7y-+|@Wyt< zMknM%!fqrO0u6nS>0S1za6>SFm4UM*e;Kd|4Mv?y7!Ma$RQcIE8N0Qfq$UH+!Vrcl zL${D-$y`4UKRv@*YxvunRBD#TT8qX>QX{^|*o4^1lM`G?FPaQh@*7opms%H)X^E01Wv0!eVnic=cYmGa)@a)XW5`?~L{Sssc3NsVKbacz^p*~h4( z@4b^r7fA1Aq zobE8;ex*GXa2@rp3MZIXACzag<|k|S*|TamrYsEVF>2<>J#)7x%lL1^z2kSMdzbZF z72CE`v8{@2+qUi0FGj_-ZB=aBwr%HR@B4WU?(VTqk8!%kd3*f<^E+jh$*p8JX&<jcr{$RrL$=3kh z$h8f!K`?@P!+ke93CT$^(l)j(4uWkWk;mj&yoPHKmjZ`cr}k?Eep=WC4qX3Ok~Lcj z{v?I;rgie;%r;#5)uye&8(`Hd-A1)qG8gRQ+Qr(3kmOX%?8ncjA2OmZYw1VJ=hJqH zgip3?y>>mONz`(->F76b4-B&Km{Sk_IEAt*Xa-+(PW<-zyWLnJkNoV6gJ^#DckbOU zM0hVimpY4^qxKafdfV75Li(`Xl~&T-6Pdv^y4l_3z^722ZPJxc`Ud_Q)HCA;IMLmz z;Dsl}&1EYN^c`g^k*hp~4tH*Q5QXR&L3RZXMn(H`^6L89kH@>5z>YYGSSEA|g;cv= z5*b4E2@=}=^yWfWob$GNnA1Ozkw|=_PsGdh&I;Qc8+R!0U#D1}h$B46HbFoB<~WM! zDTbbYsc`l``ds(_W)=QFE6~k7jE(;8ar$dI@gKhan>6>Uc`G8DB7E{7IB2n>hKh#L zH5kkx1cfw8fHsVT(?$9P)HlvN#Nu3EHA`O7t}LnW1!m=bHsUfRx)jdxan7dr6wA2M zp^FKS0R?hOWt!S%wXbh>aQ}h){CIrL`X+M49q_|u=%`y-$L9Kmg3esW=9Y2xm-?9V zHr$0oax_7Jr?y(3DI@K!W8sDCHnbPTHb02ulSI!VQU~JEodl@&M5DAnvAN`jXs1!sCDq?l9)OhA3RE$%OtzcE15{jX0g<1n zb4d-k$B;kRXe3?9q{f|{RRvTCQWr84F^2cR7$G@kJQ_A)y6QZ*cGI@!A@X4tv29Un z+`dt6fP8t~hb7||WC-;Y%6?{zDI6m1_3gz{`6C;8UNV29KUJrD)xWiqP~565e_%Vm z67=o@jNOtzbx1VO#vY*ZjLSKWtE2~(x`>4BdM1vw7`~h@iYgO|0BcW!i788+1+yNY zEf`FBxVFpRd^M#^WZkXw5F^)bMBcoI?m|OscN}IgEwy0jalx}&!b?`@#rj~!S~r5t ztWx}!Bj#`_*S;C;J-UBgs6X2Fu1%uF)QC29mFHOd$zFI_>%M$~d~Y0(BhX=EVSGlJ z0Z9dvd4{)v@=E}S;MPuK_k3~Oc`2EKBjO5~dD? zF{-rUsM67@28CeK+}`qxWTy0qx}xKqRz@x~4enYpYDr|%n+X9ziPCL-H=DO?0~Vmg z0R_fDxchrCl*e^u0B;`(P9GsCc`|3HA`%`2J%3)0id2&&r;O1B6qq|6^raHRh2_YHL0B?0(Xd48{O9xE-j(8W{MZrH0&Y? zwSteJm6r;2NX<2x6bNb_dCT!vQUnd-a3ppv27Lc*;`n|PbT2_xXErOH@n%=UM?AWSD~GZx1`k7XI+K`_E&}; zO~{H0Z6~Cpp&~B4B+jPSQe$%uIq%{%YNg~WrDv>6gePN()6{`nT{ITQR-5gdCk8dr zoh@laon71q@Oijl9IC`^4S8MI{ba1KJ+?94y~1ZM+vv}k<3dihYxXXgQ{FNF$RKdY z>i~A1EQlxO(uHSnCjz0}UFK=QzUMTT(1*BTRfOSg#+BHjQ8QV%1Vo7e0b?f;LtNva zxEedm89I{XD1D9BX~^PyNmxM@(lcc)L}lZ?If$rIZFYV`CSeCQ$`yMsd?4QbqhGQN zAFNph@GIV7-Vo0yd6!od1NZ}?LXTiK;KQAAc8U3QVYY|jm!J_dBbnMnaI2wYy0MCM zh&qC%*b4;EZ)f4~uiGSu4THg@N`1h^K=_8-axBs^SIgUc2rc-_{Qn__?^4sxddPQ2g(<_+otfGqVWbEA?$@j_@9|c>uf(_=EH8NcBYv zc}xfxr@cO20cA#a8s98>g6Ts`x+*MD907~yKlM}vESDAmom21F4{WW>YP$-$dIgaI zy{FDN1w4X9qV(a9guB4GQPYlm@`L8GQ@jW&^a6A0SDnNnc2Q60zX#QlKS67bE)h9( zvu}Uc*T+O~<=ZAaN#1=thP?glwjabid)dDdR#*RcPwMwSuJba+j!wq^nri&N%l-d? zt%=o=P=_JpOqW_mLLrJxmnu)abeSR|P|ue(d{vW%>$9y}DHSWf`uJRAO~HFx44RcN zS$8@Y;=i;oz3X!FnAS1C&p=?<{}stvbDVt5bY%1Wcpa_!=5cNO?HuDK54M*(;>s>8 zSRQY{jeWe=G7@9(G?G2A4r)Wrj`tg?Ah(v85c-DEk-@h}x9}tlVuKJWF%SZVzsx(S zKbR*Osi+haMYYXTj0-cX;iwwf@8r-z2yC8nn@7lc`r~GkV-0GG!LbO`Bp@E+U?fJ| zrn~rxG=O7cdv*bua^nDuOj=UGZ#1=(ywN2O zMh^u^#NWPBSYN4Pj0+9-vh#MWrlBvT$F@ zrRX(5$vAAp3awKR)W#*o@(`PKn4o(S;vo+Af~h2mx*8L(2HJ3T`&36UkM=ueW#zPf zjjFHW+*=;^CMFgVQB_yu)kzRE=ZlWIIZ$N9vl_yy#if{=FU9xRD%QCCg0#}bP;^n$ z5!@+7THN-6RQQ=-Kbf0AWq^(~j?u_VGk9MwKfR=1u$dg9CgYM{ra*}z^^EDnskS-sGkH$U$L1=VCiSQ2Ro#aJEdx6?!cHZ z7PYb+^>W1;JZvQ=MwD(9RQa}Ig1jB5N{VE8hVXZwU6wKsI7Gp6S_-vB8#>v~Kun&L zn7=@A+Wmi;b9Tt!+nWn^c)r#iz^M2;#1>2ik3!vpl)U|>Ky|WJ5nqX1jm%%cDh!OPE4PwnpP|}{D3@s?HTI^V$145uD#OR>tbFukq3hGYA?s)5mB|G z+!k^d`JNqv9&F9dO1kSJzN8iZ#og9n8$dmg5?_Z>UbbAAIlJ8sB`jictdipHnctt* zF!0@|?K+jw9SMg9%PgXMbNL3P(L9Je*JHhrQZmcM#Nr9TEoz6$X|{g6Q*zJO_c)cR z^Bu%4my>OeD5M~7)m>+T#-YQXR^b8dAWbdgi*e_8Nu|NX4lb9(kX3qokyhtA zJ=J{+L)wgYv|f%^i~4Zi{a4{Qu=fpPwFc@iUqz%2F$8aBY1T?h)B-o@F2BIr7*;dt#&1WGtrvuCp#sB?hu)f2~N@1^Pp)SpLD_wRYq+^ye}#6nQ&(hVgwJ)8H0#(eXBr{rE-Zz-@&lr{Lixv?Kd3}jK(vr}?5?h}q9MN*rr=w+{+i-!j%8#lr+u+H@7ccD zZV%G0FyIJai#*Yf1lJMqLggVE5>5OfG++;am~cD^2(kZY8ww7EAY(x7W;P*8?jIzg z4Q;00K?b|7XQbmw9Vdu9X*Gbes5PcY455O-HM}vfFIAJ1p;|~UL9?2l!qf;xja58+ z>WQ}(oEFwH4uQiwXto-G4wDWKmq?^z0-2;rtT4jlY^kIK3Xs78Jk*@t&~Q`?d(iTj zr>29#A%dSuTtF;Wlm_f&bmkhO_7Z0?jV z|0F$-|79&fOi5bq$TjKuXZ;obcrH=#jN;R8P}*3hUGSWATDwA!xon}igm%c}I)3|T z&g5Y}%KXt7P>udoqni|syI-JFnL)_9ebm^RJyx73(XD+O!AV3DZhF^New)stqEEhC ztij4dr0K3BDtofb#D=S0H^4$(bYkzTnH9A7`}fqZMUu0AUPy36Q?<1yBCM(vKMn#) zmOqq+o?(CTl94tB{eq~6c7J>1?7bY2?$Hwv(ed}gBBlm`P9+5q=J=(-ET2O_Do3+) z(iv4!Io@G9U4c?Fr7scj0?O#-nE<<*o|hP3)Pa|9ddw)B?Q=Z{5;w&+OU>5}7hhA* zeF6UMg3_Xqq|sa9317sLg>!M31r3{8*y#T1KVW)DcSMOfZo%Xzqf#A(B6T1uH@C$ZqthCX5T6^fGXY0!e0Mvd) zXoxT*+8O;9z=hT+>2BZqsM0r2zZG+4ArY#bs3Y+Tv;$@rn|o^&|LPnb1J26IqfFRX z`?1$&W*IJw4CpQ&OvH7@WurHwDeDLfC!3>zDK`+IxB`c01DpAetgL_L^d6KN<2?xM zaIY+a*aNr!74$W**i>_zO-+c5K!^+>N`{D|6BzEay3?%2%&P1p%9g?!uOmfNc6UMZ z`8POZnuq!g7KqH&nG4s&E}g z|F&~$4N#%YHezWsrXcE9K2_Kv?!diQgnN62sJw28N zCZ538bQ(deRIc=ogsTU(s`mMfwlVkP+mDewsH9YxLcAP#HHmlsfi8vGAcHU;z82)# zv=?0KyC2&df?23nYW_$UN$LTENF&tx!z{1B??N{7_S$)8_u52O12u~8Sg-lVp%WORA<)ujT8N%5D z3EL!3FQ?y_E4RmT5DLvd?+HGU$pGslzB9196fiITI6(iJI$58%@}+(~9e)u2Y4&gU zKm9lI?{CKcLZHDxVv30f!_@1@mHh??h1@Sl7FPtIuY^FvtCS`{Vh#<_2Rh~q1b+l~ zyy$pucUKmutv0m2EHu32wZ3Gee3!~cp?-=P<9$tUe{6c>HNABFczIpi{O;u!EMELn zj!NN0`$9cF+`9Ro+7-+ylG&e9#|#D<@_}=XjPg6wRm^D|Yn?~-Te+$s z4u3d`Pb}STY5%_J3l9%r0vmgk>~<$v%{iz-lX0{G?!ju4@cOSS%|8~S1@CqxmzX9w zM$LHWjZv6&i3iVcEbBJO7j){asy`OF+s{-f8+rn)(?CmXgM`R#cLcLv3oEGF!nf#_wFo?_jG^yt45}ZfVcns~7Ll=k=?0qBw>+juuH)n+7G^t@ha- zWS|cdCmU|{6e2j@18!YA>F4TI&1AhH+6;R+n+>@IvXv-Hd?%Wj3{|oimEBvF?gIl? zsPKozWu@v4lbM!&N)NDg3eANr%IXia8VRG1-s4W9Qoak-jK9_7h0)2B+5%mb&j!DL zcNHDgHd*H-;rFW8!bWYnst8!6yx8Ibbyb$~Cv0xijzNi6mI{PytIN}=g(xq07J1I( z9WV6pLM8*{^%B$rO30928=={LOUoegFI#m=My2mC-O#Io?yIfse}7W>vvg2N2F~`g z?*b{{$Lz1Y;)|6+{K7Wh3}^wvl(OjCROVBe#{-qxA$EsqvD>0LO`5#=*(Mf9|M+b< z^))XhjrfM)R%BEU3AOOl<5M;hxAt+ka!vJH%_Xunxsz_WQYx0r&FsQQ)+bs=Gq;9- z{j@?AxZ_ieim}xKic2(_v+vzBndnEYGx+rCp0I0ilfO7nnUWJO{oOgzi;P%+Fq`?} z_aqIXQ~_YHP+F+a%~?Uf|Bycd5heLX6|M~*hP+Fuz=#50v&ZoIxxEl*%m!C;tqU`4 zX%PUvN?t(XnaP19u&e|C^{pcuLNXBBAnxl&q2K1F0!)0kd<5TAK8!9u+%7QrxdqQa zQ?n|2#KeS;FS_oQ<@DyAz#WFb0i1S7?Ml=oygi|yO5cl)`mk_@IRs@O4yoM_?J_@+ zCZrwmy;OC2+(Lzrbp#OKED_y6NIyWXmlOz^!OGbD<}slvdrrdiYQAsfiM^NTNwqX~ z=*D=hWFJ~(lY^v$+(EQN=BmLW*Vo%qB>6@hJSlw0G7ly?jMCq}y`#W{aDINZFH-k< zpwt);QZ>SG>GdZ81+jdfKo({N#99hiv(uuH8^FruwSDLMKNTowt$rs7Hck}!~> zqYoo-x#nm~^Q?-T(`h9vc?go2qR8jC*lLPfdwf=#Ak%oRw&^v$d1Z)_{iFFDh1X{! z&{3^f6Wtjdc;yvffRYW}#rIeCT05_0nea=x+Fx*-svm#W%}?Uw zG6L7mj;pLfz5A3ljK!cG#>~{+*)*%Hu7@ zRg^jyd?QbRX(rB;gTPe0O(VI349cXC6jnMG3*!qL4C8Rg@{BNjYphC&PH-vVH73Xc zQ~~c$WE&IVlRKu|T%k4LL2bwJREn`+Ej$L8VJm=JLx(H z^X{hcn>o4`-?u?n+in)_6K+8G@^xTRQR8_3NpQT2d%i(rE89>1?Gu003nHFKT(&VvVyW~j>$HBfB^ zn6yFM#dJM+cv{dHU)Gw7tCu=y3EGyq^>zx@y5B^C^qI|26DZK z`OGl-YQ2u^CEKhE%2sC0zyWsEe+re_O15b?7U(0t+7)GMk}wiq0=ep1l^xFD!a>xN z3wCe;b*~`+f-|NAo{z`%Xc)GSvNoo*_e}z&Yues|4|>B8lXpmmA|*97Em|5BjLN&s zi{Z*?@sScf%z;{5CZ`6kEL9;NFS_t;l}?V>HdZ(7{+J8yuUe zo7Sn9t|RG3`a$|Pdf&ES+8@mCYK!&MWUz7p`_+9Z7bv2Q5Xd!`stK2dqY zbTKkMq3B0mtp$*#3~*2JcOlR5cN9B{GiAlH;=U+*Aqzkygf~oBZeCGthYb8>cZx;Y zU)KuJh_4Ii?7QHCV|%I{&xx^WdYKC1wo?@ZEMg$#EUtcXJ?M9vW#^67zkaT zPsrh8C+YyIj~7Z2v(8ZV%x=caf_Du0JSQgUIr|l+`cC$2{fOeE%7T)cff&+`C}k~- zkk>g_QkhSYsBIdO51_wf?9>Wn7XNGSISBJl4)p&Ez2`s6R?GdPXsv2uFCu>8B9xQ3 z@NX?uc1I}(v-%lUYoFxl zq2qJAjYSV$2L-&Mcnw6ma1U=$@X_wnwY@P1nqqK|ZaKp6PHu64O)@fYg1o@SGR3vgTV=5%&zqV8 z7!UG~lV`zhK`q>EA!Q*44W`A+G4%O3L6q?RGmd;K#7_M znv$?iQOWJbw|Z6gt<9YnU_&=0sEM=wh$PNADiPD#+OBYJbkLAJj41CqEo}wj>1aO_hue!t~a#l{{T=(_9-)UT_n=O~g`0Z;12o5SmQ3 z3b%|IoFRwR(KLkVFPp8GDw5oqaJItzp*JjXWQIrRJQ0*)yti?tfa#ChuTtIZE@?xB zdSP`;j_7Ps1zHn9NCH%O19EECxG{OnOmN_9q^0#J7(@cbJA3&6e?(}k{IZUBRcPVSwJrD`## zEn~QT6)=+4JckaQPo!dVa{z3=Tez&8y70Itdoz5=)Us|qs-dxri<-5UH0w?26RHbI z(l|znD)`h8rkJd3C){s7R>mIn9re9gRTw?c28<9)AB+da15*g&Zd=FSyNm)utSHi+ z2X`dmkPLP-R7(u&LQ&7uoVAyODT9&G>xJ1{3Cx z?HVl*6gAw=?NQmkP7^I>fMt?__l6C~bCDglh>;PBn-_=DnS|n1+is3Pmeg?N9JpJa zHnGjs7J99{TgJ2pV&!o7B%4RXf|~dggMz||x>!%V-}blO7w)euZ%Z5WlA^hA%N5F} zY6~9fLySd3ixFthR{06#O?)frQxN;vEzXqksjh1}?Nk=%y{TAwhL}C2@yp4}_lrzo zhzFOx4y6tbb82_AR|jv0ZO>&t67#1}Ex38mo#@cI+>}@VBseQdm!^v()zr(oQ1RinX<&;^YA` zj{{8U7-1;$ddU&lY%>0-kX(YOwG{;X$Q~lHoFau{hkpAQyJJ*xXbl`@pd&9cjWQ!Z zW$8Lxb4O*LO zh%)WG5;C9>JYnU$c;P|9nahmHy1OV}lKU&|9qVbg|KosLC_Q-JK00Q)==!*AIyV5$ zDCPNuZSO+WJjnd&V$hsha5r|;cetNBGw)j9yLbDwQa86|t&0y_$1=y0xzex5RB?v3fVKhTDpGiJh0QCF%N(8FArNnUi1uZLP!p;$N+KD%1~jdi>o#NsDtbep zn+jLNVS`IsF>e3p3XhvG7hth|B7k~qSN@2xERTMTnmxV(s>h#nj{E_CY2Vx(c|(|a ztTLb9MDaAqW97D%Y8ze;W>>-W8#2AI0}#7l3vE(eotWZ~YFsZ)8vFB}6yhZg<3(f` zV%8%Ywf>_7!h;-w2AbU;n4XP!g1yMr&Mg_{a*X*cEYcs~QDxjaCLLn#c7prxC_*;s zE$AFlf09a627sPck+?%!;gcryH;FEigLP*jGdaA3W|U(;%=&RI;_E4o3r9GZB{kxl z!Wo0#V=EKyv^O|#Vw@uLHG%7Mq#1!??dgAV!HJ7h7~#N8B}R(_=(aqA)r?~KG6@7r zcOW@+BFV*q(PXCvPTT_WEq5SQunC0PGz9wY`VR>!%TauxQR(J<39>(s`R{evi$Ac} zPkia~6Sn20yE&x$XEkVO<-6%r*WI;Z+`t}(pl)}5_yqhZLF1FDGensqWssT z)q4RhgIfLBdQtK45HQg%Y2xE7Fld$nJejDMW671u2rUhG4-}Po$IG{EvDjt-hX^_k zn2Enp<;kZ)bDBy<>K!Jq<}m=QCL>`#FXGL=N^g_llG-wTtug8D6B(T52g9|Xm*wmt zn?+B*V_Ymw;@h0GijTVh*l=-SYaNO2==)6SW4mz|ks{7L68Nu5zhbHkP11Em)Ykr* z^NNL*D44P1xGX;Ffg zN{;$uK(mUuz7qWI7QT821Vll<}is~^Kpz2v7ol$jVP8 zJKeW_JF7S#%#HQ6LPPdH!k)U{&F$TgH3Nxib@5;-JMw9260U1K@b8)V3oH(*erAqg z>s*q|G4C(*$t`eR8KlSOQZKhiBf;O>GDF6tYfe%~OmbOTDdlS2=0uL`o6Vj<_98BD z!vh6V{tQy36i^B8cE){=sE@bYdVKU!{3tejApwkm0c9|w=rnE1wGsW6!mzT-bSgbi zssogra$h!0-dbeJjJ0yx3zrI5KN5_&brX)O-l{<>$fV> zugvSKz25-I0leIl#AhZs#JDlopWc+aDl_*8J7~PT1bxikS?28Z5@O^l$l6PSz7%^Q zeD5VOcx}IYkO(z_#XKqR2m}KJbxsMuhKmU;%Dyl1x4QhYA7a|4pN`rx)4M9@+S&js zz!TJWgCKoF?#byd;tdh&61t>Z^~@@r$1WB=#vcTFVn7=8TFrBmMM%>W@e*A{n!7_< zNvgKST>Z5AChNXMmHN6R1rXbsz~PtZUUoV_)aVUQ>72&WAmL^cyo}ZfmKuKh1@}Ue z^CB196P_8hIb9}(YU^H%BIuv%9YjIuf;6Qn`Ba!!mHtrZ>$#qVN%ZPxX+~TyaLu_c zw3)4fPth8vF&q+xqOH9d(HB$ju_`pVjSPbyvW;S&PWB>hk-@PnEk-^}N2%>T$m0PX zc}d##$SsO97}|w;3H8vqXY;w1Of;uca5JaTX+yNYsRJ9Op4RIM+$ckebehU z>*&YsemDMBv;%h|kdDK;wsotW{oFg?) z^C0m)Hq9MNqGQU1W!~9IQ2N9@*hE<2C8~s@a-4LGNi5t;(-Ah9U!6(Xh7Lo6ck&hq z4Pzy4&nNm=`W{81}!3~waG~n;J zC@u!xAff)XN7k;K7vgFYSThNbK-DP__CCtq&vXKqToh9bE{x;;21~6SVgi`lT8Sf4 z!o{&1OY{rTRNPpGXzl4P2(xNFI5H3op{93xgOX?eFymM1rnsXN(-Z5a7eOg*CL=7- z!^MU<_~eO$k&N8u>!{I=LZ-owsUDtk4H}O*g0)G}-%qae4+@4sj)d&4_Ryj*bbG0) zrQ1df)HrN6f`ALL{HUHT?o$&#shzu@yK1m-M;sVbC#A!OhqX2rxr-4k%}pr~K(_Y6Lzdy{W`9WFrtVGOUipC8}#%0x!S$`w1$s zxi$Ewff;;v-xZ!f7I)k2oXa$2pH+~7yO04~E(7{`jkXqnZf{a^N9Jq5SL{{5j(BX^!#Ie*^3og3uo{?8Y-}A?i07 zz%h*2a;f7oSH+dno_JOV&2B@`PP^)=@u!!MB2;a%SH^r&E^v2BFfyq8|_t5Ta(yHY|`t_Q&2e5Efp>6sO3i{h7gVu!wgF z9seZ4?7I7U9P<Fv6+h;Rq07$&kSI$4MU7+eN<4cepJan^6p?9ME3= zVz6jps4PS?i5NvTAQ!B+!pamg5&P;;r|z zdKuf>=Uz`&Z%LziFopUM zG7V^wRz$FjpO(&TR&#n7I57ib~&G$MmHhVa6 zwKDVz?^l5gq_*-t**u;2aST%^*Eg4i&EOohEFs8Z!#%@Sve=dSYsdx6qCzOi;D@%Almw#`YmJlo>&@ zw}6+RXtz-p+{Cwb2e&RpvT0{J18?;AYj=-+&e&Vi?88~W;Re+DP!iMG8G!$W)LJuq z1Il|Rd-k6Sqiya7@hYC&TTRfoJyy5WS@x1^8#?O}`)^CF zh^W+sFA8USzq&?vXRX1^n&6gqH!R@#b-}-Wir7robFA?2p)vBJgk07tLkKm7M)FR( zf{Sd;!F}Iie~&fG$s$LRx7h6~SsUh&7*F@H$06JZhD%k{ts0Y^feUT*CBN1tdCoM$ zohGi)-44&t@#kA;2cmE>0d=lnH3#+2GMkUaI3@Uba4Dd`CoK046M1rICg1rp?S)ik z_T@R3)Cn0p+R&(H7b9(Q7b9bH7b7X?Fx0l9+*xS>!yNGzw3c5MDl+29_NIr^)qpRL z_6FjH^2ED2ID{?9rd&KA8o|p?M^;9#t1~PH-uLHJ&{H-1CjSGUpVCVHl|e6inaD!f zOlLl;%cnZy59g{KIb6Jjy?rXDV% z&!FS*mM)W3tGGXM?)1B`!R_OZaC$4yJayCgJc>R+ zI{~E1zF4CVft_8OJ8l;yf;y31-#B3&Gd(Zd-6vWOGe>V;b@@J_w#cB665k*QE_xvn z`>Tln$_(Y9`r0sAV$Fxa@Q`#DS-oJaq}*4A(D0-rq};Jr$^2noCGfFL7<J+H~brmVCi4%^H zSxjyr>QguQv(XaLVv{?47 z2E{fl7?P+}#$Yfrj^##J{mV*d-D{DiVDik&1-bz8gUbo=t>S@ z#!Hh?=8=)q%og>Z3blxHj`N z{^xC9E%HV4)AmaSyz7SBh<-J0OtoI1fp4ac%w%io=V#M73hqNQN3KAyNP z+h`0GU=%|}k_T7-wv(;sL4P)VzTaU2lbA8iWVd42R7pUpWBwUph@Zf!1j*2UMqpX# zRd;i2dcVxvb^!$O09@e^5$9JJc1_&8G%yX_JVt`QJfy(6Y!5WpeMkmCpPooVZQDxc zJy6uUSUN~f4%i?$q@KBG{0?t2#)&Ol|FoF{xy@u_CG5wXDP48~=-v2wqy(=nUBp?Z zQ909*VS_xR5K#nVMk*^6uBI$O!ua8f&?Dl zkn1z8)J4stwO14K2E4mE;n=k1_>^;P5f0%~NmI#l=@<|)D)s3-D!^3lJYX-(hLi)z zu^bi&gatFP+W2Dk2)q>oxZQ{EaI{9WpW@wNsGu>F(GV39?ZiWOOKT%s#ce8VaGS31 z^c0DpOcaTtzNaDmhFOUZ={8mbYF{k`@qynUf2k#Q{^f&xgDC2gYH-Ugzd;7?dW9HC zG$6bK9lhJx)r7oWgz!kw;|*nvzmatHsdu_oUnk`-!h_wSwP+v1)JK21q-c)jX`^4H z_^cmZ`}*_QaO_?#ku$;7gL1RKEstAPKD<2}`IjcgBl6z&H$aXm#zp-@dB4U~4XYoh zr&iyOaq|^#*er#}Cwh@NcTEo%{^*FsP%LtvkYctFK7l#V)P7&+jeHI%2UYWrZ@OE8 z(eM=9O^4s)S84GZ&9Ztw+5Q@4sx>ceM|=rq$UmM28UN1<=fCTus^%9%59NbZg?g3U z`K&R=TwGGKsm}#T5sGFDLCg{SPyk6lQzNyZVoAbiIDyn;44BU!zl&JTZ5Vj0o&uN& z#x`U7(aznFooYF%qCN*wT%UUZ&-;((SN+ii$IAPC6}~T+9ppX&5C)vUfaVSZ(e63I zMz_$X7stT+|jdvpLGaO4T|Tf7%#2#QTPa~1`RkI=YsItWmh*kMtT&Qwg7sC}4q zRX=cV;4#do+@4IR&C$C6E&Z;X(}QWES(-ResvHgmnlzU?L931kFVqE^TEr zO>zutIeWn!#d5D?*^vV$Ez6IMe(Mq&$GEyoS4oRbjHq5V8F zqsisQ0CPSLF9A|{3h3|m6R{EEzMxOHy9rKfke}4UbY$KLWb|67)PF)~3K(QP2l=h1 z%bU^_VM8I@Klavy5=!#N)s5>${m<1)1+Di9s-Wp^Pif()nyGM|_?&*5PI5)vW7w>wb zYA}Y7qXEOhTH@prZ-HUWlID<`P3&}a=^)+h_2y!E+Wg-bt zgezG~*Zl8q%eW$$7k=&*=$uZaORJm=`40#RoN!bVRKj)lQ%48pWcG2n>Ppmyl>AL0 zBFq^KaANmo#A`@N@vGLM7p+vgG8k-jOhL+a3?V0$*-Aw_)Voq4HZ066JJVEo7$V;# zAV`Z1S}6<5*d=>`v!Q`G5s;PRZNwSm#UM{fTY$-rO-SU;J^lB11z3yk<*~(iK_mD|HOgnooF1$7?D)Ij)@%?$&6a(g209ae5BE3Yed%fZb`uyW!!$5#? zn?rse8er6YuB>Vpr-}3~#x50mCy5A72&*@BO&CfTOA>4=TlaMidx?7Dn4(KIjsi0* zFOk)pNKRwOlk3Q=^`j+G$~#cToar7SqhovzjaO#+GxJtpBHzbfY8=f$caAU%`nfU2 zmB4(qhFEH(+&n}jBhwqM32v}xHs8}4`gGk?LR@rrpp+_>%z9pVCokdKS24~eN@gDH zjPMMi05OU4Yi~#_3b9r$jZ?%G^w3T&UkLMkr_`mb9-gfZ%uEOb+51i-Zohm_75nd& zu*H&lQ1PqKxomO4X5?ehNrR zTCOVP2FZ!(#;fGa-Dofin12huw~o`=Sva>@vtl2}+NPU!1mPB5m3^PtW$S!4>9xqiph-JeCP7>{RGdQx$6p0#LsjtJqke_9DumODnE00aR#5 zYXgFTyfM#e~?3>H1l;QY!>g}@_@@135ux}nKwJB4+2jn}PxWgTq z}Sf=@>X{@TKSYErnf~-i~ zxZ^T+>4s+3)iK>+=1|+LO6O>e1(60#g#cn=!mdh)@%;h|_b-1|*LIB*$=bFSC5DI< zOPVKNa1HARV7~0Z6=^6|(1B<+T_E(8Zzvd?dtBM@EqUL&P+vkKX4p*p9>}a^b`09M zwIyC>3+e?3?J}R>+5!oV;fVO({*XMUn8h4@;Yo!ojIeP_%2to0B5jCcupq36pQzSd zc6b(YY~_Wr2ocr=*3-~(RdGX37; z+?_3Gh30(>RQ?O|<{OlkpZ%nF>W@v(IV0~vSdZ@4@@_@6jeIUc;6^xK(n&0=?iM9qHSZrJ)-L>G+5{h@yZoRZBb^9_QU z%eFo_Md&4Nu+;{~WD&4>N z$96UAzZT;@WMBW;APm_*8YJfC1b_+-wcCJj=hqh+7Q<0ae~m%inpT(`es7XM!xL;QIQOzr&8~@V=v5oAPBMT4T&$N z7GtN}BMLLat{YEPI*gDx!)y~#;?OcSiuASGmKt>}bDT%QKin_RiI);y#Bj+xWR@Kc zLw9_UmdSk(Uq|S5UzXd87$NoQ*&^4MSHWzpGy|hMJwckBmoZr4`9ElT$KcG`Zu>WO zI=0iXjSf4uZQD*dwr$(C?R0G4vF(mdo@duN|MR~4?B{%W_g%HB?pmK$%{i}e&G8%g z=IxXjHf=pxv?fj(t8v{#^kd@6OSfa{^Ky-z;alIR(+#qV4!Ur3pC*~zM(%OV&1I>v zd(e>x^P+cZJDVepTEjOf0%E_jc9NH}E3(qVRdeie{eiKnH`NpPZ zM5ji;`EQt4jxtk^q}wLU?FrGb^p= zkW}#H1lpuhxTg*!wa{g|X`(45s2GaI&!s`x{X$rU;{4LKeegCdL{4j=3F(dUQ44pG zs(m!tLmJ5-d#E;sd=3h~kh)OrfNt#*nk9}5Ns7Qc00fdY0T9TBG=%l~H46=KKh;55 z_Cr>>f^v4sqB^7Vu1qr5qE*Zwrb!tdqW^M~~H>Dow*8D#P zO3@abQioNmg0l?aGlPN%1%Zwrqx!)J%@bY{QD^vC;~M~Vssjw2L{{h)%x|BN)^H{1 zjbnD!>jDG3eqx9nt6IBy9H0KTDPZO5BN@-`%#HWqhSHxZOzda_!om|(qT=nd`eiRx zYbvS`P{hU(!QY!i&h?}otWg;gH`<=uoz3RsA3L#)vS47R%Oa{tCl$U+y&NcnMIbZJ z#NL}4WhPpBgMMt>ffn0DU_M&!;^K8RAHoY7!1_sibF@7E5nsc}ALP_4Tmn#MtProt zFLxNel$}_F%UV{p_lA?>P-jPK4_sK(loSKMV!I55m2aYZU)2(OW`RRVLgXDdDl7-& zHhYUI61D%FEq6(gfYuGU`7#LZ;A~(}UoqpB*Q_zu6JfNCMWx?H1r%1JI8o)=hLrX? zso%|eMaJ`r8?dAYhVb%Jbc3MFzI~gnVYvmcdR+3uB67mp?!)=V5#bW4r|{s^6kvR* z8q@`{1by7plI>oUfR86?ex&Lf<6LcU4B90_Z{W6eV~c)8D3F= zz=mO)x7dRB>55541Qo&Z_A>?B8R0?_qi`Ul4MIJD7dJFFm86O=`W6I=-N(BP2yjcJ zEClouoZ=1G?-EA-%6!fm6V$vRn zJfeh&3Gheic8rdOo})cK*AzC>N2`LRhH`DBH5B#4x|mpL^B>ivJ8(>Pz}eyzbGOcb_2?J(%*&lq(uAEL)%M;qQa7LEfQTi0l7pY3Q`#8TM zc>!zzy6`B6Gr~&p_A@izy~Lb57;ZQwwC9^kT)@vxYa|ANU;2s+z;A!cwaQuBMSocU zP5)7K_)ibU$~FeJ&NfE>LRbB_cmLi+RIFW5zIcFS;#}e@iLnAj#No(<@QoFOsM56e zcqEN_YX()e8Rslk+Ae!01;Yq$WZWUy`M5mZk1@}WW47K3S5|D3nv>$+9UhIYCbPJn zc<(m2m|y30x8H#P@K&NoBSv5$_R8H`@ii@+Ot@EeQlj?o%LSOda3fZz@>2Ny+~^$W z1#129(HXccnEf_QB$q4AV|GlI(5jQF+Hp0<9?GZByOaQVr+ z%sLYL>18!T-E&m zM~SBcFR3jCKq12f+bi`kMlxve0Di>7>Ly7Q=*{pVurJ);=gVR3PZ8rhxEAD7zgWxL zab8kB17#rZhrp#EM4tW}t73w4i{JYWPOyiP-`OO~!K)k#sXXI7wH^>~S~r6tiPsiS zt@*$(7of6e0a!8M*c|XLt^1?JHZaG$rVq!SjrIVS@o9+084h;}{2EJ?imiE+8{u4a zWkA2Kg2D?;YiZej9YJ90n(MW7h+JDnWK)zLEq%o_b?;<$5kUD}wsUfeZ276xHGEiO z%APpn8+UNST~W^(L*_9^?2c9p-bUTPtBqQ4Sb%VU#eEx23BnE`@~sCkEs-sS>>Me0FoqZc z04?yCQ}_e8QzSWrM35w=*tKu&$Q4mccjYGoPj|o!yH4l)J$@d&>7cg=#Um_noh~El zEBrv+c3fedlQr)YfE!@W#COLMMhGxR7DU7lQ+=y53?w}+z$RY@^BQDEm}h~oYB8%`Fm0aAwSpZVGe>i121}UfLt@d#?kBkNzYTu8s zCvlzc)&avQ6xqSYe|zPc1Z~VXzD8owe+2mJ|A$B7|DSsHbu?s|=&3kP|vn zQOwX|EP5y+O~eL{V*|k+%wPN=4xzSrK0Ha2?tPr{k@EOlRC3Cx_t5xoFDd(4;NfA~ z02PRt6u#(DtXk`x zXthoSBs6&8;4bwKZRcVQ^n!c^yUBVMybS%PRzjYJTr!i)b$=neBiyI@ELZLhx1q*x z@XPAzEs`iHsY4T{gztuM%MH!3WuD66ovJh{ipC>#3NX&;5I4T6oxmY(JOR%pujUT4 zycuIU_!Ep9t<96gYssw#VK4)eLJl3)L86)YdMin+){G}fxBXc=?hz#EvIZ8}J2J$- zBIs`thc1GYWZH|nVr6WYtD-9v0ZTNl(nDmqsLk%;rEStq6efbj*5mrY)eu(X@ePd{ zbm^$`kC|+Ld>%B&Iv=TqF!0bkPgvD=t3UM4e5gk z#YyeG6B+&O__D}4r{J@NKte{nVLN(??Vb}vV%Z|p2geehDp>5V&@zmNrveZ<0 zY#t&w4fc|Y9~FMV;B!+}V0zEqdw=qZ^Cr^KI2#WlD;u)#i$m(BTH0=G*SkLBOhf41 zn^`0cmMT;C0W7X3auPe$X?dGhH3O{~ok z&_Eyx-0u@qu^wrlI8h1#jns#ezu;bx$3%vRn3QV$Z?DhVUl`Y^t$C_z6h?#3?u^c^ z_k(pNiXDrog6otM_r~)mzE!0BiK9T*XVO|1DajWDsGz=cOaZJ4vfKjLyMx!|)hHRs}ilyWWu~mRl z%Sekg)l)WOk$bihr^;{0(IuRL%^j?$Nlgj2XIom&*oaOuKKh4=A*qKHCVpyq>_HXu z(_$@`f&2^xtm;gQdg%MN19hTO2PAo_392MpDv=8G<*sWcdiQ|NdnSI@1U4NySY^al z9G!lh*v*q4?}Q+e_uuEr!bUemibExBQEZPtu07U$OniCq+WE;*X-z#Auz*~yRFxyU zRahFoM?aZAQoM6Xb^SR(=u4ixh0D`DCK!NRXfA78@tTt*#5&I5kLVG&f_mZ+Ib#k? z@}7Wr=fxJa)Zhq4cy}*1Tfl$lNfx+AjOjLnRGE3q9dm%E6viWX`2kAuib-x>=l=p+ zbq};Dn>UGfb_M+z^f(gw7Pyps4YP(;5sT2Fs2)+JCwdOuUV3%cb)5onZQ%q{;+3%Z zjG7b2$cjyJN#v6_j3|76cQlx|4<~Lh$iyM(MH9Ieqd#aX%7_kT9j=6CbftLgC|hS} z13nwQ!sPNuYq-qhQlmFb;H>{Vf3&Ks`Iu>H+ncb1I}Ccw2x9sGz?1I#)WP^#`h%K! zMN)|^k-rNf9B{<@B}l#U1eLY3eXM&-^usZx7oU3?S=&DHJrdJen<8`+to#18rZ(r# z&$Ut4SWyIH1^TFOu_rdzcvcbdc{ZJroaM8}h+}+yyuShf`v zO2MEe3*=wccasN(^Axlap4mb0I&9N$OgxIlK!mck>Ns*SdSY;T|c}22G%MsPOHTFr z?-hh}wlcXvwHe3a!{ZkfF_PAWMQ_XVB8`$2jF-@biUuRQr*Eu#IfsMPZtw(Ov2(C6 zB6(D9NFivEJEY(>gmi|Axic-v4~eO_4*c*N=d$!J{)dXWtBckBX0p(o?!7D{7*`mZ z;ruh}#-4=$Lr;OWrA#r%v`KMjY8#?fc-+IPE$Jp|0S0%>Msgw98=`6p zraTbzwHqZB)OJm};E1iSR+f|j*zC@|!Kj#G*Ziw)Y^o79@wTV&T-a0~CCI;quPj_N zr`t}(O4LDGJcfokRT#Y{kJin=|2biv-HEl=>;#e2iZmfL_1 zkgfaKI)}h3TQK4muv+R$7exq<^ukaGujE~MO*R-+3dtGbZI~^nVURBdUJEMd2LI+L zlpcju_KiV2*{lnAG64ali7M#C*apNE=>_AjC4hp<+I-=!Q5F3kIne)U8vlPUd;eD7 zx>PR|afC5HX#=%FcUXhM)i~GHh=2{OsU;8(@GL0mJ%a!Jvw5Wls=08Lp zvx`lcH^!NqBz-mDtIXB;{OzdCp}4Z?R*5f+8j9TdSRPufWaWu=?IRZeC}k!Ide<@L z!6q@xG>7h|fxF@?P)OPE(auxVbi3GizK)4FZeu^jUF%4MuG>m8J?@Sqy6WUc zSVs(Qp|1g&{)1j59u0VXZ_uuc&iJ;)D-wI)dQ57SAa>oI({BW>KhRNX;~? zLUKdgTy#ngQJ7S}qNg_gBJxAxeG&OP)esaQe%yZ%`4x@KGP3z9zKHz8b_ahG`5mOb zTvwfr?ap6BevuRYKG5K^5;a=5sCS3;&jT&jnFgNvXU?Fc-}-{@Bci<7*`2J(rE~O< zy4vr)*2%(7xRtD^_9s<_Sk~L*5h%ec(8Ym@p9bN+z0SL;RIx?XqDZ9Z1XWZI! z^tTG>GT!an0bmq+9VNy;C{#&2RK?QRq9VET6^CCz&gvU~X5HfRu{WdpJ9(6}nOB@v z0`#HW&3+!Q#PhUZ(y7|OQQF+l>cgIme)C&~u7*!!JHAL1&!&U%ex_LOl8Bd7$`A(S z;b&-vMUQ%q3??XB@?Ab&mr#WY?D3<2qfH;!&WkbH{69$klpBb@k^I`UzR^4^)k6>= z9-gx~GqteWj>v57Gv24Z*9dg`QT4aLMv&FJ(yKB>-f*p;E`;H!g@Q#t;o_hNl)kxZ z1US9k>{zEfJI8PKN>6u^#!q~7{W8;75Ad>8D)NALx-ZZ!=RE zsf$SOr!U))X#;Bf0vsVzTIR3I&AaEU5uVkzho>taAUC`gWluyw$l(IB5wHYtGDWFs zhBOsM6hY?UG%aJM38PC?utQ}UmObpNnvt3CAxz2*xtqLjQa=;h0t#CWnV*1je_EdJ z4Lf5}oGI&H*&!A*kTIfQyEN?v?a67BqogJ0CPlq+Q3^82_0`JvG$W7B6$hd&c+l^HVsI*_NyB9$O}B&3kE9daG@;7xBF(;aaN=FvF}3Vgj?I)V3Kqt4UNU zU<;IOCdshbzHFB3b6GU0Me#Ict&}s}dRv=%B#OUAl{^JhMk?^2JykDE8}YYz{lF{s zqu9pPh=G#azWEA8UBxl}kvn%6Kdz#YgiKvCIgLJyK5tq=Z;Oo7Xg-L7<`!q8`P>=b zU~tsx--9I*eo!UL%G~FzvvTixlNM>8fD7jOJ(eD%ZP%B#yIEh#t^%&%iC`66AwHJv zvXP-el)}2X5vbVg2(na1B(20LxzL`k;iOVvEKE=*mThD$(|!@tf+pa8QuZ8aB5u$Z?=|D#152BgVYuRzv#>5{^5kl6^C|9ssawl=6eQ=R4hPf^m zLpJ7gBKPud4-}IyiTsQ0^4#sb571nUR;NKsaFghhcBslXK6e#;Xf5tFw3`}G?aokj z8j0-GfU!To@#S1FYjKy7vJUmLdnVImxX?}{XW-)bLynI@-{qj-PUm`3TEDLsj0%8_%9*i#{VA|IlNSq}7E>!|lNL9$^+-bBe6)J4P~pJxVv6 z!KCLDQbi%Pn@LMbSk#BVam)2ze9$s`ggJP>p_AgvtO@`-+}$f zBv|I3D5ZOG^OZ7V?4y@>cXfzPymyhiRS2d;Suh9T13uR|KcggwJ0<0yFh(|cSH zTPlVA%V|k8)LN+URrQGfQ7qN^U#oimQ<1w>Lq<;*XbHV963Pe^Ew8F#L4qetOy^A$ z)08A&AG2;}*_^aui@p!|VE4Wam|}67!5W!(j$AKkYklLS>8W`(EL4~*4!$Qomps+Y2X;|Gux*aSiQ zXb!YstFTr=n?;<4RVHZzdkxhmHpnF}mX}+!erJeJqGxl=Kx-;32Op_y{et2MC8O>9 z2BF_SHw_mGz>j^YRCi|GAYJ%6jWSLQ`8$Q*xlB^Q+;=qYHCv~E%b3z0klkfek1vN0 zO&SFij%hh^k}~|BVLeG@(p9N&nWUufON*8sa#eBvwSH5!nUE1E_lS&^va zj5kj;>mj6(d?BF%z|uwISn6HWYRK#)q6UMhN+*?UXB9PX74?;R#rMluZz=4MT>}O@ z7yjZTus;0$hoCOTB{M6%KosCs_MK>7v~W+#zltCgD+?T;jwF?ld@=?7hJ2Q`(M4Kk z%E0+E%X_%2_#M_o-kwfcag=6 zX^Klji)UO8&siVeq|H9ri&VJkkhiIpjGquqGwcZpyCq=%)2xIAT&kkf8yS&W303(H zd@-0Fy(Fy9VjKKQ#aj@Kqh?2BKSheJpzn*g9EsZMB6oS3+TR{M&rz^PGj;L|L~xqQ zuOx~K4UgdD8B7l*!ZpvOTkuhVi-&L%I%Y_wAc_x;Crp7yS?GRu1Y#MY_=YV3a-wY% z*hi~9E7g7aqaH9dK?Sa|&AG@w>1lv545PJLA_-D704>t^n$+sak0BF4Y3J^fbfwI> zS(5koDuJi1LKR+>8SUH>?UquiZsSBR)3lv(c@U&C@m{@&2%Q<~3<}M7yv9XLdwmwy zZU4Bb&te5d^5ljEHvH>Zgh2Qgvk2gg4nCKSS&ATw-&e$fcM#t3^G3wt=a!guXg3WX zaW?{Ex}u;5S59C~Hl-8_pJ4p9IozBZ-3^Ra*w_!xu(BU-VJAO8!Wez<`UcfTj}e0!g`Q21@+Ow#Zk0I83MzAQX4<{TNTUSZkVMqye>tldsNT01MoMw|HQM0 zl<2IB2mxBYX(yLR+U8=n6JvREv9M|pvgDvh#hQXr!_cGa=(j<1{66_waTDs|^SD)AwT( zsDXb>lFy^dR2i4h^CvvT3B1qKw;oB6FC^~YR9K=oJD^rM*fXfxO$z9JDnF7@8zb>X zS5|^@UOnwy@SHL#HQrKfBm4$SmC%*QJ{M8-*!5jqCVfKMU;Ud(MC)t!$r7U}R9Pk+ zmib=nsuW{}wlk68HjETXaKmkLJO>qn;PEyaS#7;V4utAB;^rsb>ZIy?O7Z@IRjG8@ zEK$Yxj#Zi#P1AjE{$c6sQLCG0?$^A!^1^&Z9-`Y<} zZ8F?96$~iqZE8&Yc5#~!elx*`f^Py`VC&jeO?f#-{L(mq0}fHk-y#d<#fgH%o$l5K zm?sNTns}21X+$$wMlkzJ6FmN=3sCtPB&Guc0oi^D&T^8VV5mS)P*6Z$T$!)u|NN}} zlRZ!2uU%kgCv#hyzs7tKb7LzblD}QTe?@Wq`^TfI{gs7?=^ac$BMw?PgHT6I8-*F) z|JY$si}q5TC+uIU)|6o+)=byYx_X~^pU*e=t7}(aTE0=ot@94oC#t7+k2!;1Y>JxUfK!w<&Ar(5UB)^I?k~o z6K@O&fX#4nc6NmalPV=@`JduFwe~;VLc}^4$lH(%Tj5FQ$C(V)^BuIcsT{m3v&w#e zM8#N;F0A?FCn_AylWI)P2xc!Va$B{EV9RoQFQ(%pDUV%kztMUcE)`*5Sf|M!mzB4L z{3{`BIbw4~hKj6PvFO`zXxm9bpMzRWfV#}hu##Z&VAsB4R1KBUWH?s#iR-00@N811 zn8=Y}8!Q+3X^(1ijQI-|ndM|fSV>(LHqB*p>_2DT8YkUMza}kI$a&Tv`U>RU2{r_N zy}F{f9(C-Mr@l`TLX1?L(KDlVv0!yRB8u5Ay0;(Tt`V+wRVUtq^m0WgsMQTcTSJRJ1CD4$jse3sZmk zkXe(QDQ$2+l~R#za*;(+JAy+bQ#YI1j4C%+G2O#&s@tNsTAQB7>mQA|6$txj4Hd54 ziL@0;tQKmgzSJA29gtQiuw1xh(c%q>Z$#z8)=_K;iVPT_KGl)bei&Gwva5cdd2);~ z%7*+Ma73v&@Ct(Q835*|8L}X#_t8p&ILZrYYNm$X>NuFV9E;ZK-dc%~%2m8sp)U+r zBT~>MjFltzs-);LPiuiwHcDjhs|X9YG`ZXrOexsxswLM0DS6Dfv|9rIF#EM?u4#hc zf?}Z=_<2yNO2I|0TGfkJB$91un9zF=P+Z^p+^2*jhDSK!#+dXW2e{vItW^Qb6&YkDRLXpbtT+DKCIB zC7u3x8S6&e3ChX;rJ2h56{Q1RY&3*K3-X!AAlJQ%v<1Ea|+^7uOzghAf&6mTW4===yHI84q08^ zzVlG>%K@sR+F6K9n7OOO2Dc#@qYDS0NWIZ z{8?v@D{|dQCAB~e%OrHl!1tZ7_?qgK=r@4-6?IwLpd;8_ivaqL zogw^}6_G=yROLi>ovK|@7t8}Zfc`J-W73b3(Dti~3jd?_Ver3P5&yjoDrw6u@T2lz z*oSCOgzQ3w>yCy-kSXcj=Ls2-5Sl~{-yTn#ySPxY%}aBUs(+;MK7+o=4|5sYI}5Va z^IOetaAh&OPPOr55%BeRL0-ejf}w-kz;2L+!f&bw8$fS0GyeFMP|CgB*2~lHDTsIP z;-TG@cc+5xYMqJg_ZrwnJ2}&OaOg5epT13pWRc^PO%^1GRLnMS#k?d=a_uWeD}Un` z?PhGx7Gif8|9qwFiirb%|75%A|vyk-L%M<3;WyLHe(DWAM|!1D}<|YXd2Zz!p=|aKvmu zAE=AF^Y%9{8>mWTovb+zkQnIc5k~_3v&awP{@qZCz!Gw0aW$^AVi-RLVAoj^0`b=I zJxlKNUJyR^iF0&12hR{HI>0wFP8AN6Ylb29rro^Z)gp;a5ZUh4`n2{2!Ix{99) zwpm;Q9~>40X|0g-Rz)Lj4H8wduNgh!uUwmkSR09YN>ulk!xK$ZA$g^@eokUh{sY{Y zoO|3)M7~!Hx6X!+Rjawi85Zz+L6gg^F6JlKtBp2C)4L3IDwK?fDWXc8A_3nRTG=H@s1Q;W z8LcjqNLVqk6^rDUaPeWI2MuNkeR=|*a`FaK3T2> z^c0c``eZos;&Tf`@fC#XB@9-w9@@+7LfIUo=JJ5Wf7uT0E1%@aMot(|STKMOVwE=| zG>_~K7&I>5X7BVy>fawIlmgS6$D^rlj@mUg+u@Jtgm>^PKQOLn8tC8t6fUV0(;nMF ztg605vo*Eik4)EDNONH&PM{wfnX;ioiXh`e)UdC2$S4#s(9dV3xz!IdYqQIis<=xV z_bjHmJ zqFtyHt7*9@M{-#gdA` zpn_)pqz0eD+wTbq3TA2`EgorW*8k$)cqa){4aW{p>SqG?RISxbToIpy#V0xU2N4gFwY-5a1_!EhaSIAj>^56-^dQ5luZIFq>o8P{lml&xc9>;QC7 zuG?X40n)&>ZFa~dTF3m<1KIug_2-y)nOqq|eVHbh?Xt_F0yL2-=K()FBX=sWt=XZyNh`YTGg zfovJ8Wr>7XDQjm>EWKuwW*Qu zetOhYa8BUpGmer@kZ8iy;m%(?k-0M6qdMQf+d_V<_6?>Jo2?)Kk4Ar|nMNz@A z%P;uy_S>Ob0xMi{TKK7%^OE%OmMmw+ufehx5|i~ov000Z&H5D~SW<|ZfHRJ>z7?do zP3JE9+Jh9Woo{g={^3N`6wFao*V7~D{ zcIjcoYPX!xdM3T`uxID^;v&e4^VD$6Vnt`7ECE#`TDQNC9fif4;ubq6M|(vJ&W5|0WU{&)8;ft&>C*=+SE%x(X4&9-A@ku z$E$+p8u1POU}3XAC<0=lxWNiNS=)4#w$dO=In!XZ#=Kc8FQ*r3G(?CYo4)kGjtvRZ zW*1w)?gYKti9Y<9wM+M6QCu^gIyl@R5hMiMZO2SKuz#nB;F@|xJggymp6V*u5B9Vuh5>9XApVf2f9;Z z3*Cd$&7xSd?iO}s#lkj9eB9%ujjaG3LqAuL&%gQa&U2dh!e0be1cHBR^#4({=KrhF z|J$HBsbVcVFNf;=4N#o{`g4%o6SN#|L78C|;X9cSSaPHoTlaGxg6o+x>eWm$a4{2b?-O$5?lM4>P(N(MC7@xJb?Uo^FzG zQO6sV5a=Mu;{c|$6nSFQIC|9j9%!$#@bYHFyGX&ba47DSMRk? zqsB^P0$3!a!+NmwQ0MN-U@_Ai%S_cHeu9!duwJ(zuqI7y`?E+~z#z-}*ela1W&I`P z@O_P_22@#j3moTgTm7)G*}A6lT|pj+=@tf|B3|=}%3|IHRsT&^cU2CwKSW;d$;sc@zokLqgFBefWSQ~!Oz8&!>{ z6W1mjsd?)723d_X6_ghjzKXqr_0uN&noZngMg#Nz-1;l?N^as47$%i8cxOS3pas&0=2t@x^mFYoz} z1n*;lUDx+PNUnnCX8?z{{jiVV`zgly_abhHixCXrqJg^I`J| zXgCg`0CZUpYIhhK4p78kvug}54v&JZLzL-gwB+KT_$V^lTzF8e6z(wep{9YYLuxkf zpq(h4f~a0gb0U?NuM|%TUxOr5G&m4WoReJimEEpAU{WkD;3UIT7Psj~ydk4Lx5$j9 zYBJuYB}~88Tvl-<$sM{FIQR%0$!bUnjfWC!+}Z*aF(3-bRWAW0waO`eEQ6KYskk*N zW-4qXrE?;^s;*xRGa`4lX3$HEc^_u3?0`qf#CC{?Yz|YEtP8-p}I{B%SEcklQ?zG#D&`D9vo#*05 zaFT4Z0^nmu*aDYd0i;$a}w053_eQDh;yHQnk+O|vvu#DGqGe^w)CV>j-rWs*eXz}YooCKK5CnU`R-#P zCenElamXUA+@3Q^N2scBmRL{M`er+pOjHg8F!I$-n*3)CYLGk~Xd`91rw0r%XL1FB} zAKO9ed0nOfW91QE={TPlWqaqlAhOWOKAI|VO9|255~Sr+i}pk{e1&LJ z*C0@70Y(0@IaJm0-Jcgf>kR4!{UI;s6k^VNz_d-4VUyHGl_91=kmzGC67a2s z(2;vcjoxE8dXMSJqM`=a2lTIU$==fZ)Bj6*s{Kdp>3>m;|F?4a@56zT<^Q8X!QNg+ z*;3J?V0W8Ig@yU~rm|v>6Qo*)G^v@UyGYc(vG6_j#e7igUDUU0Kv@VIW*ly%Ww(7z z>uE3dFYk~*6>by^)OLyhwx3p|JnAIL04vL?`Uj!IwsG)FM3c4K+Lm?6#o+M)8X0S= z#$N5eh5|F(?97?5akzR#~&ho3B+IC`I)) z06*T&xB&>AzJaErVx5ZowMeq#-NvDwX#dF2V>frK4zcqxtQGoM_4d-ZM^?6S7IC1BC5GI&~LmIh=ba+)^Us- z;Qd3U8aULFa=Q5Wi+qM{F8!xOxp+q|7mXH|y{MPa5O&mEe`H_Y>4mJpi$?{Tu*kz1 zK9VLR#xiPEQ*0JbFJ}%e?PKm%F{wVw8)^ia---1vF`CJ_t5->OUess5z%@T91^(FH zyY^_)gGi1Tm0d~t8TS`>ERk4c&8mO@ovjddUC5^0KYkTwi3s(bf&lvf2QJ0UGfnh+ z>+tr2w+rYIXE#5}ksWLSE>0#i2j*Vos@=@)xj?~~rKTN6v?E(ztN3sI@R4~pU#w_V zOdqtVzxQ#i2BWD?zJ#cOe-xrD|MzszzwQ+O$9}!3w(f|cjQN>GHp#|FDy=~WP7U*y z45bIYuw(%aGX#{BNX2fPU^O3fQ7r8;t7Nl<_>O{WnrSaG0*UV=(i?|0LY{TAxLzU4 z`-At-{&Uu*bp2{D|6C&j?|HUukK@bxlq+Y-`^mO#4`?kY!JliyXt$jKFrThLT~RMF zJ%wJzuiPTxUVDNyJB40K;1cl8am3LxM+KW0;={XyRmXTL09-(=YC5{Ju;Fz~MY%HV z0eC1}mc4x*gL-Phqr{7nO!oXfjk5%k(|Jm1S>~?uupAuZUU}hAJh-&P>4_5&TgoIA zqYmFsffW#FRV;>cT+2{jW90;gc>@V5^SeN7KI&`?!*(+2y4K9)(mZw|QziL%N8|xY z(FeOb%qT=9v4UwzM)C;pp?ng;p&4f*51Nb&v?Os&o`JXeI%ri;77CAGW920gOp{+3 z?5-uVS=(NUaF;x*ER&pwDat3cycvlO3B_mvH&zl#5-Q9|Hr66!>qS_eqD7u6vz!dV z#FOCz@v87f?mzR%(hgUv;Lw|M`$-Awx6&o5J2U!Hs&siR*;qwXxp!O70yu3J?-cSI zo1s$4Of?J{JZCL$6@*w(B+WS0C*c+iOmc>a?59@Qv=6cNu&^9s2~H~-1nrwqfwd37 z>sJUf_I`Gnfxua(52fUl96Fh8A}h02gyB}UCW7N86fUyUN-I8=V=;p_FLPM~V_~~A zB8TlLkj~hl>9SB;;I5z&G?LXdNjiQ?py>3OX<8dkwR+VQoX27Do@h6oZe2z0&{*v+ zE1%CCSmmvJqj#7g#<-n4o#*08*ChFVaOp^KeT?V$BmdM0JMsw9IGq}aUR$Mh-4!uB zDaO*Ksws69Qo`s#OF|K$l&z&xH`;|*tpsg z2Kz?vB+R$P?7*P~N(u8Ymub7z<2AF(qy9 zUHeAq2G_|LKtLDx%n6zsAB|n8De3^*e)6m9q5~4Y)f{I_?6#n=O{6Geyn2+jR_q=^ zgZP~t5DvHD`$|360R_rpK#ll}b=gaQ4dFdh-fMdd_ZBU!gu(b~$m{_uxXYbNWKTvL zJjmHPV;Z?=u;`p}>QOqikCB%xZ`H6ei9$zI(8YJls*w-6d1*WI$2crGWB}}g!HnCS zjb_$N6mA_J`(nk99In&_PJt_h=wgtLcnbQZN+rOpU1$$$4t_^HVi>Ivt02T?z%f(N z9$u(p^Bf(FJf+74B^oUEc48i;1ky@Jr4;4rgBy6C=ug|#MW94y%U8K%pHnBn}P@N@%QM(#O;zI{nhH&asKI~`X6;l z|LaNhuXguu^VX2^y3IU4B9Ed(av-XP1f`r!QE;)A#SI8Tbu6N?ggh1ErDhJ>6q`fc zQZjwgT+U9CEx-=}P=MG_Ru&XiPQs$JWMSHAYC5IG^164_as{LVXzSJX`vvj@o(yfE zcrigE2K``NrToSgE1r++7ZUiA%zb+CNZeG0O#fK0fY8(nqwgZgxbXCQ)#h2 zqMwi%k!=mm(2-0JsoX2jr|?H$+e+@YqzvIUYQK@l=?kQ8HVw#Ixi!B9?R9BGUDvE+ zm9ovtqVg=~A3R(z1HEiZeDwg_fmK_*tI^WP3)I1j#F~{Nv&<$WdNoePkUfX@>SS|t z$JC0z3fsnSist+ylzBrw5ypnS7a%jY2~K+~mMS`Gmi$On$f`%IKA()vu&yM5(IRLc2G1Neys$n~MCl~cD7;9gl zCi%2)uVVkiO)%uwT_CnL0ILtb&JtR(q?Nof1|3b`SquaXL_d5P+Z23M#g3+pM_4H@0otwr$(C zQ>o-+|GUTNad!9FH~oF*;(agH^;#3pob&mS+yoR!m%bEf6-_^vx9XHV)312s7@om= zWekx{*7;^R!bbLl0p@=HGZ-AYL@tN^mQuvO*K_{AH+BBI^g>xf8?$e#|Nm`4=SWNY zAJ8oVd=^__W8)D*J`x%IY~$#Xn#C1(xTT;{IXY7DSRp(at07An8d{Be579QdsN%}K zq9J{STNxdp_ie~4r1!738IyRK>O#wsTC0w9XR~S3-(ENNHx1_VJ)eJ%IDx8On_)OC z5C)kU47&VE@JffcKbeVl13*EtksapzX?Q7jJs>gmz<(t3Sj>UxzvcU-fa##z*88c0 zb&ea{;NHT!A-Ft2xn~KUCI=YtRx)$_G0{}&=r^LH7y|3;Q@BB&k%yBLDYBzJRu@*J zFB}EgHYwd=oLh{|iGimvCu{$M5qJ=arrhtyACXtC4+n|PP6Cc4=V>bW5Gi9ZFTsnH zdMkoXez|9js61i{))$?h5+fT;gqBWG7R{!&LD)ER zq;$9YVs5G5uTd}vHNefijpihXZP;0%>goccSi=d#{PV3v<6wemA>PBbo#1@A2>_rW z6?O+W!PihUg2=HFR<|6jkcFthe(H}60`xp5jD8`cRLz=&BWs1~@*;%U>l_ z+;_@lJ?VXQrdVv%9vvt+w7=+d=Pc(H*i@6_UBpq`#EtI<=4aUT0Sx&#aWc9T`q|4I z22al{s|E-%tQAaf(x!zOP(Zr+FqLJru~f>bIklSrrm=-hCi(2c$tSYny`Q;A=1{{j ziMB)Fl$Y=5NGy$|dKYRqm#IX>jg)X%moO;Hl4GZ4*LFE7pDEjTaDxe|Pi8MESZ;#KO7lJX+d;#E$f@15PMpK^89YWC_EPPWZC za>#9yIGg zZ4iIX;?po6YY&q0hkJn9I*0<`v7SdI^VBxUh}B#iD3=sqI9B5kDXUcTIA)Kmc%i5& zdK96RsS)l~c0UQH4lu?5pbj|F9*mK=r77t-*pW!}vIF4BM~zlhDM$dI4MnhlGawC6 zuknWF9+21rpPD>r;NC;KX=cP!yF3Hk*!(=OujzTt!={yf_D(vwzLtHpvxLRmiNIS? z#R;FYqn6{`E=ZS5D?0DLY;E7VNvC9Z8mli0X!PezR^2jE653(`SXxq=iM}w0(rTER zy|cW0&nz}HaTY+8(9IvJ^Izx4{+=U zTvzIMIyS=wez_rFAG^h`v4Q|!;5^HRbV-#@1(P;EGX#7BA34}9>m}e@TN5QGVoYXm zL-&be$yM%Hm<2hXcexGJhR7^;dq_bkzl|{6M%V@GWLjK#vutpiIIZX7Xum3p4G0G@!uc$!v( zL%*9gcDZrnRb&A)fHUFIhJR1C(fV%5wtj>uld~QQ0mB(70t%VQut|DZ$sS0Z8PM#B3oUQCY4o{ zsO2^LuTwRhSmu;i68d{yJkl}lYI1%3Q$L!0bs>O%kMp!C|5JJn`EQa-zQK%S-#L25LziCV_vx7W_Xg!UL~2F%$>krxyu~zML>toa&K((sWfKb=ZOn$m^peOvJ<+)=hY9Eri!39Wz4#p!;ky zSaQOI0y#;Op#5@M?}Y^=Q-FbfwB+o>%e+TyLk>8oAGRi&UBJF_{9DCoZmpzZMX}a} zscR)0(ICS}j6uviClbyQavA8^t{byiwfGT~S${V%V8*f3rt|G^Pt3Uol2JgE75Wr< zLURM8Acj)RR=Xxms7sABx_Ti7_KuEsW=P}g-qC}wNknA;q`%5LVbqvaFrBd>ZiK$5 zN=>1rs<7oYix^ZL5QVXk;f%kQ1r=(uSu`h2HM}}N`*Z2y-qzRB<(cte;4FI}Dz1@@?-S?R5&rF`i z%JLOe;jgH2$nqFrxE<{+9axK=(xWAyD;}Ov0;7vE%DjQYxVy2ci{JvM8D3)YteU|r zBLYep?!`giABZMFsjpN9U6p^eV?B#uPU$KphyP`VXZ>hIgZ&z+Opa&9w$N;})EGjz zgvrC}P-QD14+SDnnhWQUbS<|Sag*emRJe{jQ^}W}fbbf*Hm3PSIc*%lnq5-vPUl2Urj zPy^kTh9*CJfD5Ic_;GxA3p;<=I}wMQ+#=IW%u70;`=>lgzUo7G(Jq$m5A(J-i z^TM|`bk#d72qCU$!S{Yzpo(2bK-C;?mT{P4cw>Vlzx0q|W@$fDwgD98vP7TcxO(0L zZ&gY8Em?N)oTiQ>_za5-{XyvAuYr2h@_bz0AWt$ZwbSF$R3n2fHc^|uoetuNs<&)P zD1Whhq#gg{4qZi(TMV*^OWO(3=y;70zoY88MI#HLp;qgsGbyEhTvKh?>m8IXdIuuN zXJfmNRxIKhI<`-nj2yPu*UXeGYSfx;E;g_~yr5?mHRB$*^`ts&%4Df92iu@e@9~n) zx~w(Lf&bY9(TjCrWT|9~G|AM)X`y7h`EzZ0|FgDhrv3SJXN6BcYqK*zn)sVll#Pwu z8om-2-^oc;=KPCClxv4ecs5%$)n?DvBXWoMIyal8O<4A);d7yQ@JIQaY&te7v?2Um z5OHCbOFZtt=KRsR`7%1o5&VIz4Z&z?G(R!GRhx3y(e4gfFf2PGTIE;MN}V)r?f@}uc!cZ{QW!$H8e#mq*)ZKnOjYuJ3%Uex6BQVWoUQ3 zE~`v4=wB%pQnWS|`$*k_MqS}fUmRgpEa+WrxP|r#Ux=B}p)yOdnsyBGb(k}1rGxy( z567VAW^`px?E6L}QZ_QZ4j>9drA%5ds=h~ssuLd1< z{dB{P)H8Cf({eZo-B}ofl0<5iZS?Z2u?yY|m;>NFQ|sgVdT7{ECKGVk=C61cVeVmL zyiY4FatBSgt==@gM>B*MC;KkAOhQv=bG6L#(Z!=~jUqfwN!t>RJz*`I>E96(H0Z@P zZR*_41O827J&e&=54obp|5wC5)K@H~xajmWbo-*zd(^D5tUNql1+B_? zHqN3dSY2|d>!0Phqk4>&c|E^U_{VLD5m(kLPJ@a+(I_=x*-qH4-ALjATG+Tyt4ICFyrhp`nzB5AfH_JfjuZDyla zk%G0QCZVxQx9uR`f**sRq6yz`$wi{W5izqcF3!#UcC7 zY#StJcFouJ;{7o_lHKrULSW}FlmTtEG}pN>xMydqLu3l22lw=ZGKw79o+V*+Uju*U zpff*@N(8cC4W<{esZ_%3$pFgZ?flFH5F-y`;G{!27BieAlQ$ExIeZB@8CfA%VeN8B zu~D+$rWKY}K6Nogf|gQ0w!f+E`P<(0UMt3Od>1sI-B~g5?oJJI&h`Z6)-m-|tbXb8QE#(yRYWLQUyoW# zJ|V>BgKc!IkZh!+q)~(0-lV?kvXrTqweTZ)RY+F-1O}%ZjYn zaeY#ceYt?b<@1KXvl2KU6-iimWtOj?We{(@WaU$?23`PG{f2$ z>mM>+`KaEgjNZ04uB_@%O9nMYq+yX^D&%fxJyzn|6(I*Y&(fQsjf)@3fFeXoK2N2R z_8*lLi^Nm&D3$|{A~xgmGtpL4AMmB!&Ah>owE|w7r#az#Hl4C0-rFZt^3|>9 z+DZ~-7B|f}NE~+c*m;cMb3)zCJn;%sGT&XH|DSA0g3d+YwFfP!FRRcW)dr32`vW^q>9Rn^fH6TPLuyv$VBGfV~{|0YNYS_J9?!j8>aE zT)%|>?W($bTyHZzYXB4##z()v&#=?hb)xqd^!dzAm+>(OvxU#;BXgh1*ZYo-Y9 zW9X$Yt{hjYL=gEb*MO{&BXTl_=}sLZd3$+(+nC>g|9As)1>UF*HWG(fi7o0|>xP!S zTdar%Ho;dw^#QPZs7vrrfTB|0Q>^Z*&USUV~w&wOLp_vG0Mgm|CfnnAHkF7E_AbFXbIJ!a@^+3fM6$;aO15f8?tD$Yb=Ua|m{2`p>ulL@jXOt)Y(bM&vJ zr<;w$(8AUYb;F>6iq5?)rtjl|c~iiyv;Cn3ySb~tIs(iIPIKpIQLg#QVPchdxz$3| z=AYEuL7JF^EHw@VW2GaG56X|B(j6lI*2kfAOyv~yT8mMIX6#R?!(_Pe*eAIlx#E&# ztd(Zf?%Dr{Psh!VAV7*Wp!5~SoEUAmW@B)TlA2TESC#?RfNsm`#~tLx8Ja@<18*0C zV|01Au9N=vj1}Ytj6dUU&7D2PgKf(FVASs~w*w^wVF$YcIz$1(Bl=1yQksJR72n{> z4}jFsuga1xsW;<#3^bZH1iWTPj#jQWRk~18q)#yzl@i=imw*w4?5y2IIOyzi6N2{3 zCR}Ta7$kFYx=H{hB2v?GvNzBLjHze(nQ+-`1iT11&Uo1|=Pq&kj>O_XV@Rky?3I_~ z#KEAtpvwHgkR(r!#0kX};lRs3qyWAevoophbmxZppVFP~e_y)$x9oPLb@4y5o6ACK zveGsh7_o#_uBC_Z1nILVGn$1|9onL8y(Q?FoeW2CK>n+*z-<*(IM0E2Ft#8z{xG8N zE#h6qSHMAA#+KUynPf+B*%jN%b(i_SK&ZYi+YK3?Pd7C^pcX?fOSOWoL}8A=*5H}0 zxfmy}BSD}Q4%_~)?qa7vu0v7&&n*dVo6Ft0}`&qXs=dz5{ba= zyBX=Eea22h(Fl>mN!Um%fDl5k^6hpk9d#Z>L_8J`)DH|j8ms1nB%b)miNqj=+*3*C z_Et@pzqgC&sL(2&Yw^@xSm?(58(SP>uhmBS(I%{ZyQ^R}mQtbm_r)&HyhWI)|_wgtfKV?ooJ&uG;j*GmDiD+-l>G(SL!HimVRXg znDA!3c!Rwg3x1yq!g(<90H?F5hOvrMx+%m>BQeWyHtSIQktB0A-#fV{Nu2WFpV+-- zSKbJz^Hh{aym=h!%zV_=cj4F=gCo3k|8J8qALTDWjs$vvgEOUV@O$%5O`*f-2xw%>FU*mACl+4Iv!h()2X!=g^q$;hKb(SM7BKn2w@hH=C)_K_=$HMI0 z_JI$2mng%6w1nQUkXLnb>#SF>92UHmP$)T@UUNB{eltq`5loQk+hnm8HDdi(63gv!B_RVvl{^QrE7wr(JmAY_Ac5X3p%GpzYSF(S!AY z)e^#YvTU}fq8`ILJj~1I`$|+2Gbzp{obaf(pfZTbYis<;YD0wrEG%7i0Wg$4s|Ygu zwPtPf`ycJ}t#klnvB2od$=43lmDU{^q&Li}G7uK-;>?P^>0`tZ|I%D#Q}8IpW$2d4 zNA0d{9U^`QsD+^i9(^4@+EaUhezF4;H>E}*!G5vQLdl|E%r;vJUl5^% z;UrGQCuRQ)a5m@DTMHI?w&il*U90KXcn=-3h2y9eA_uf23ihbV_l76q$K89(>3x)8|`H zxD#L^46%R=Rja!~B`BSjCtVpZe;inb6?rCMbsFnbTc=Yh6^M*e8{ja9eG<^N~ z{yPij|3}GG^S>tx|62y0Qr(h66-4_)Flea~MY@GlRMZ6jFdV{VlnRAVBC{;84AU#c zTyWFEOi43y3oo15PjKG@eI?=t+{tJMt1K9pqPDDgpG;=H9sg)>mh18T`T+0cA@FED z+e?Pb*|nVjScoUbZm3G7S4j-kMe=P@Okxa;OzV}9x0vd%8cqPTJX(cQx8v||mNz%E zeHqb-wUg_j*Slg(`(*?(>MJdkcjh7Ks|xE0)S$2l7$yJ6t?*T%%wJ*%Vb}di8LBoVLX&Oc|(at|gjDhzzAGu*X2Qs&D|x9{#M1eGM$# zL9$HQyZ!#kzx_RC=vm5**lcMyN`memytFTXQ{ugLx#} zKM(y(!b_ltytig~BxFJ6K=*mm6@JT+7v(t>b4x+|X~#+4DHpmOMd`xT^Uk-Yit_OR zxo?<-^kG_r;wD$7jf4SULQa-1r4uEJ?Bin-Yz?BlWUS=`TzoLNRpD|CXow;lX!L`z zNYowG<(SbXjNhfR)tA9d*C!cgn(&Tr4RKAmXFCEMlO3_+SzC6Y~2Z9=Y3T6VJ+tGatAV>rZpPWYe3E#pLXCgSLi5 z29&^%z+^L1Io3^A6i*<@Xe2urQPil2i1y(P#7_URe$&z%6fHW%GF_>q2YiYOoo!T*!#AiL z%1QP`03=#|X^Aic7RapDqj?Z&s6#nZm2Oae!Rawc_6$1&q-u6A)VBO|QB$#Lp!us_ zJIX|Lr5zlIp{HaqZ#=TfqGPPhW=BaC{m66I(t6e;oZMtW(NmwSKW1T_W|3Wuc%I>% zQ9;qdv6y**wJa8dg4$3OK0*I0EJJlJP(5))gC|Y0q)}ztD`Tkr?5Z+8y#<<&Aj0h6 zj}mnn*%wM#VzO?;*_@7DjKGisM_jn|gw}(Q&I0O~h~9)$*<)`LUyY2voPF1r!7ERm zcE2htyEj{MU?x*$;wPdZvxB426aZAzL0g7pnSE zyuY8sjwO-dm6q3w=k!BN%iM~4zu-V|`>R-6|1ckfx*o7L^@+6V`s7%c*!0En&An(( zB=U~k-j{N7@fw#tzu1<*X5>q-QVcPDLPB7fMV~?p#OnhGAxw$`Ub?C6I8CwnU(0%2 z)&AJzy6&^m{ju!r;Ph7WaiBf?P}$lv^tIaB34*KWULNi98L!>94)$uP&)Hh=Z4nks zH+;8XO);D+nVVr+7epOc+~LN`je&ES6Yq13+=UqqZI@EPtVZUGo+a?fI>jY;r1)oca zM229C{w^R%RmR`198?1R2O1Iz5;_EG1_=Q*o19nNoqtxkn^`B7u#aj_v|lY;xZTLu z8=4pz+5G#KSChK!H)R;fciNRsQxS#Ie}6tXdD!o&v(yqcc-1w7A_!vhame!2g(^$B z5`tOie$)wY>tFK$^a+&(JiiC3{~kp+CCBO&PMzK2l~=Mx-$LW3e^EZbnyPNEJpdO51Dy^!QfkD}=S;i0pK|Pcn2?WR1*D&j`c^QrRRmy0>zZb+E)BC;E~QZ zCeiT=vZ8ud8rXErn+CU;F}H>%`V1UcroIYFCi#f5BhqNC(%wTYN*RM|Xnn{BVco`R zEoq5q@K=}8xQHUFE{TcWnZUxM+-8~Yq13L8{C(&#z9r`*Pr|o>CZjAaHyb611Oe&$ z@x6duh_a35arlkqv|Api$Ww2cqe9TIU?aR-W9m!_$X5@dnksRn@emqXxhxx$jHxqy zcgJ)g8lawANK{qpVKV)2>XFIIg7Xj}c(JJv&71u8@QTA|CO-{vKIX4?T!x1ogQK(N zu1<~z2xE9saB#PGQgpWkq~5h2c#Y~NpvAOWqjNwkz4w@l9-lgrR%7W7e*D8pJ0uzz z+?wZlw>tXaRiTfML*3=Dmf`mF)vdI*i}Y9Zu7B@5a&4L4xWzg9Ewql$0Nts~m1Z1F zH#$`}4<>&`l$@EGPK+{B#h$uz;Q`+B~Nq2_oN~|H-t5g@g0BFpF{1T zVC|<#n3q7)dp8ZxMMBi$8R9?&9%XLZ#Qsw0{xrrC&eY=hQ<_CIWsgMy&y<~$?Ge3N zxjGQ`F{vLaKzal%qx3_HZ$5@O^OK&lLVzF|1LzUBo0LUsQiuK)nmuih=W97NJk_WhLk9_DB|&icpF7Cip2`$7j#PCC(OK{9F3e2_KhNb zCdrvkdQqGUj+O$p`6+g>qB)ABjPq-v)Ne_3F!#COH(5bM?%WuyhMwNIDjgqC*<4%Q7REbN0N6UhuMy-`UW;-u)SJ4WiHAZEyBG zHA(yB^>93OH#_8Y4XO|#&41bJ?7bR>D$3R#oN?mxzzfZIn}8Iy8=zS*hNU*WA0x$(gjr0)EHBOte*NLVv;;eK{O-q{zTw0SKKe{FD|;qA`4 zO|n;oa{Xw?KA{oS;&JD8z0(IGe|MV2U)kT`zS8m69Z^o&y@oL3mf!5o_g}@$yJBz$ znRn~iWa%q;5faioE=6I!YnQ;Eb@7M8D*o$@@NtQeNDc5s)S|pFF*Ke+?BE!` z@D!tI@`8%a^5n?nlts7J4OHq-ARPI5eVXUq7L!g5N;g;38e z5f`D{*sNw&!8|j-;L*Aj;E*FG6*`k)mZ-hl()eG@W3a0oU9PZgyP@TbjURiUXVdy# zAd=-Lb5uTC6^r?9lwgh5T9t`e5gTeJ3}?#DR>mnTJ~y*otBAd;x(WOkf`$an$xCPE z>$4&A&g@1c>jC#Xp7;nyQ%BJ=;O@4|;dD96rD@1A5GtnKDp_kcJZC;ax<@Ea_Gzc; zYFW4hGA)yMiTxfg96#Qsk7spqphX1nT-lYgFSMC_8v<}tYHo%OsSe;ETcknqox0O3 zm_l8Ss8kF7VsfFUCn_=x;ezO(vpi%gVZzJ27Cy%{LdgE^; z{ZV1H&P+r~r@I^ZMy%S(4$NpdH^7#s>SC1Kf6*BREp6fG-$ziCG}pRduk4m>dP@x_ z+@WDlt&$gjSE2CJJGdfXs)%klWTMLXZ%v#I_|nuUCv)HeSo&efd8rOS_y^_%Xb*_J z<@!%dy@B-;@5p)S9Hw}6Ay~R2YervbSU+*P8TN2l?1C8fGFZBY2JH`ifJAYxdD2x| z8%9;j-WZR4 zK89M2z9Re5)pqKzPDlpchvF<#TZ)YT5g+%sreyIA7uR^6G2smtC;QMDX1ta5ziK1n z#_kak8Lqj*h3-kZ`|%M+{TrpUy}xndbo7;#Ao&*4|M-hrbK;fulVUbKf*HNTSggb> zJ*e2rl3uQW$?kW`9pXm0p|3S3;^I5+}>&b!gsS3EP^{nw`lChGy7Y0_8v zAK3|o{$++CvdzP?9F$M`+C7*@^wqQiRS?MIp6x;{3jzkPZ!J!y1H>aKv##YRR;@HT zQ!jr$V|g*Uf@8+*z0}5hSuZNwcPJd&#ZvhwZhiiGp8AO~OR^~5Sc17@(KvbPhUhM0 zop6FOZS~CD{tKCXat6K!1)-u?v#zN*nIXrE_1m>^=@k2Be)A$Yk`X?~Y<)+332M)P zOW40SGHD~T2B_T3d56B1yrbQJI?t?FBMvhOO0yx~srY5JV}izi$+Crkmw zWqgHX$c7bd;q$JPEDOC0X(%hjMcZy!M+yI_;fvkmA33vl`1S1 zBm2ufeJTNOj3=z}B43?3>BoWT@XwM5$xOa<>b)MYzHAY;OZPRcP|lf47!?^Q@~Dpaq3Q0U z`pjP&Ku+T>#0EQ;QRgZoc2nB~?H#t_t0OyIQ#IqCw{rYK8!U$Dd1mt8`09EUqMfRA z9322pt}@k{_vHcCN=?z(Ov)u8bOj4toI~8Sp&B!hf+P8bVl@6LG!f#&8?|6T(MNi& zFSh{IPm6`sz^z*)=@|s8jWDNxcW*s(yg*6~R|Jo~bLUaSZas#-PJcu`Gg>plSqzaMoKcUZ*Y%Y|}rJRv==YU-jI?J38ch4l* zJRRwuL_5RuYMx0vncHSRvcb@lYGiXuYpn42{h42XSdyWRq&w1~wBp;cQDL|PMO-|n zA4AR*6m}b!_HiZO9*PmrqhpP**d?>tO1j3k_6J(a>+=Zs&v&0QCl=Xg!-m;t%W~E9 z9rtQ2f-f7|=i-HcUN{OH1lnG>-Am$^J0gWxHl}swgk9L`TS)$4U->k`>xXB%UzOmZ zvSdJ+&J=2tlmYV~+V>;64<+4;R5o$*bJe3p>co93aNopVhcLDi5&&{Ad(Z<1b# z%ID?!*Oe#Q#YpX*ua@>tZCdvWF~q*cvW9oT*NU)bFvRKGeMgn~g=1ch7}8N%i}G|} za)TBq7d8E#YhXe?bW3||fc1sZ8o9nEXi+eABw7&FRqWEf>|P8PaG_K9MMJV$_!fxf z1F|PL?KWdM79DxPA)vI*kV*W(SlGDCLJLWQXrw5;>P07)pwbgR8iTIsRalKAAqof_ zTSd7+^wxZ^9_G#2_Ne7L#B|+)bKX?&sjA50s3)>?)YW0GLsjNVBe;!)7-3ipa4lq* z%WNmS^n_-P1$~=!M*}Hd4?H^>OA2z?m42-kEDQ+A49em(jptJ|R9Jjy^4!6AhhKz+ zy?KRwBhBq*aQl~)e_DQ6$K!Z9F3J+<@lJgI;WZ>c#)vs&zIr+|OkJ&&mTVJk)b#tb zrswDSi$xVKA>i;qf5eR9TY!8GGy?O92#6GXk02L!;rfF`8(+xMOItMD!%|$l`1K^b zrOJMjJ`smkb(HN$UhpUDi*WA=yb2r68UJ(VJ+oDp^=*kUhyS0t(El6O&HuX#RWr14 zHT{>{>i=p?|9SLpb>la${9jlFUj}G8&F0RQdbPqPWMVLo#^zuJs$iu!BqS1aD{Ia% z4mw#k$6tZ6K4tG?`njy1z~7!QJff9c(K#-|gnROiyuTXAk(h#0d1S69+FmkGI=7r} z?oW0EzF-W1^g}KBzHvo5FLM^*oSfcJyY$Fcsnx;)+ZafD38kT0liv(?{Ovv=d<ZykLnyM+c~2WdG^x$*lbX|hH3&VO}# zF7iEc7YU7E3Pbo8^1?XepCQKil?&2OhH4FTvht1!fcL*(&=AYquOTQh3dL(E^{Ys? zaY2xyOqePy^=r%ANF@=NdHqA`Xmk&>9X;c-KJQMUhJZGCbwg zf;VW@*v?SzXW~E5_l!A>w#>5^=nXXUU0Ntj+j;(Zkm8Lx)m6Gb1FS%vw+1uCyT}Q# z%25u&r+o_+pnc0vp@lxp{h{|0Ay@0#p9*r0=%ru&k=290Gn%0n+mZJ;lFJA^ssq`@ z@xAoKdYe$;@89Z69Jz#+d>A_dvD_yQ4cD(tL$60Jv=l;yRGib7C-HK|kdka4#L>5I69G ze)>+>$$;rN8j~0-hCvfX?a@F##CHG8{MZKkh}|2o#OV@xaKq`6@}Ygo(u*sc&OIrQ z^wq*HjdMVj)H#17z6|QZXlmq_{&*U!1N$Tl#2%;3NeHu_<+b18s^P5l3g%uY^*9{*cBzVbp_LjT$tqe$4o7nUG83P2tL8jDBTh6xs7 zBLfbU49&p8DPNX!lK|M6?N8dUE&kG8UteDT^|PYNCoJ6JCkO-@GCfsOlYO(#JMWeL zEaKl~`=*m=gp94RdO+~I;moGj^-Z?(b=S!^1V``nW^4gS?ZBS6vNuJjRFqeu%1{ta zaFVFmm@KlXl@kuu4NKR-giHu(kAJRBAo2|>p-z1mlsIu$aPGIn@Bj+|@|3tKFU7$f zQFlNMM4fzW4fMUMU^nq7YJj(LtUYu+{tm){q_=o%N&hQDHzvvUi|7R;i!au&(uc%w zOdywEATf!2NG;yX=xbP{Id*tf9dgwK+W}nC72tUBC5Bt;HwgxA1tGDWPYmZ~uL83H zLQE>aj4J?p$;~?149K%4<=viGT0(?%i$6&4O;V3K6F~p;kh@!@hN{Q6fpaCg;x8i*Q6h7;ey~tq@dlLTSXYx+u;M;(bf4jb6$n1=Mlk5 zi^Y9nRq>LE<~f$I{WQ7rwcrB1RV~S!urVxi_jBcG6>jiqH(}BC-$_Ij;F_ePT7aP( zrkK9&bZU!bNQ`q1)MdYBRZQ-)^oVmcn92ZI3#3DEa9548T!I|cS^`|O&QLvY#=Y3c z6m+~{S{S_{Fkxpsf5EkS;TGF)=Dh4YvIJr}E|Nxk)!X!0C+lvl`R7ULKS!EvQ7LM< z*kOjqVfkA;TXG4+lYGSnN*e8FEc8>Y4aYJ$DcWvST+yg-w2bu1g*ETkzx2xl62{zh z`_SaZxyTRTvF*pX=nv?z%}qM1cIiA#I}3JoKeYO|GgI!e174W(b_0ld`XJ#h?zut0 zZ7s}OFKBie4`~LesgRSU!14fAXIh<*5rzPfpg7{eq60d<&MHvrs17 za#$V;FeBJ%(hLt3rU;a@nY;GJ*qNV(-8@Hcyaft{Kxr zH<_T>FU#E^0ahX_l6GZPtp=g4Xtb#T7Hui<>8rXEv#=hsJyUF?(k&{wie9iihOtGO z$o#?A9Na9bZ0VU>Qd5xxFiVwMk;TcBnU?6>60ZJ}R5FF5BuZwf2FT_Zn1cXkl-204 zgfoNMz~NM-BqeM~4Lj5>b{03k7#b_HMFKDBR(F=KiQ*v3R)Y-Zv#4lu`KuA<6GY5g zxUQSbQJw+4KALN%JUQOlz68}x-p5Or=Dw!A!)vLsf0i9{*kQ) zbKNJtFOb`_>zUsK1VV*6MAS4c!guOhMh3>WTS{+ed}eGEACV{mEZG?6iMYV|bLS1& z4MfRghzy3LDFI64oI=q(2m;0dbq)p%#9IL74LImkaB@%HnBX@=h9zA*nqNj8x`TE< z(s6STb^Hd(Fq#2w6S}<(9|sDh<#yFz0ZmXTlhhd^v)LklD+bx*XNYOZ&)iqoBWQft%9hT{l zaw=t!!^7WJM8B77BAnuk)nO`u%!PjzdpQ^^8N~LnfiNIY?&uKhbQcwDIZP!DE@3n zqp0xvaFQx^d43iDRP^V%n579NzdUPa>ob?npycoqgSUUTVfb>#*^4OdOJYF1d=KVn zhXgn|2Aa6qqS9;~X}7^|GE)>oCFo)-P`v)3BB+QyS>x=yN!r|R@9zB-H8B&;Q4u@APeur zwFUBcc7hy)c3KpSn=f|N2@- z)Xvq`)XDH)L(%_J8``9PrjDwP_QeO4W`Y$fTBN)QkJgXk*g}M^SqWpYhNf*zIR;cP zMm8;@aA~LAq0zB6RqZx4vP=-CG<|lb>?QXV`bo{#Wsia(48^=3;xXa#vh}B9!s}*Q z;Op-lr60whsLdcVa)!gEY(a_p!bpZMr<-9eQXm$M2&)_v7RKK2g7>`)vD|?susIkN zN%-E0Y;Q2pjViJz)*fB~$#5=uK8QJZ=7EpIPmQ3+Qojcf8RQEjbj7e#KSy9pES+T$ z6+VKnAgtwI7v)C}@*3p=7;tj0`65s7WGNX5m0eOArc@XF6_K>vvH3CY@ASe8;+9g#+!?I9J3&Y^qur22?j{46+Vn_~qD4jip7Rk7P}Y2x9LltSC5?xX;H_5rd%+m?#Hiz%vV-_IA^;%-7i-atI~*xJ&4? zW=NS8-2IkgwbEHH<@Wv|n1jZK%Z||)_SVj{#0h_l+KYmhh^H2*8jf9+Ai5;#&K5_| z_@;t$NZk7YZjZP%fpGeJ2r*Rs1xm1b0<@| zJ4WxM*{u&+xor>PbP(;$fV<+(qT}i0OSe?QYjpzbdqL}bX`^fp{{X3$a>rE1lB>Br z54aR{$2ath2010H#!A4m)Nm}kP%6@-V=ZipSOr4-MC`{U&Mg;n0* zl?JwHV$s>-l|@q;*+M;#Jc($$pUrT2iGO)^X^qR}U714sWY*I&(#;ac;~9+7{}I$# zL?L^X^p}>w%B;Q=isf)+G23W04b~38e&!de4rbhJv6fvYwaZ@4NN${t8SK=C?*hV} zK#015qjaP4eWFTvfHTiy6_&BYkWLDXGH{+g6gh}2NqPqykSz*GQqo+@gAfYOgSh&$ ze&}X;Z#BLpS6XpxD#yzPs9`Mxob8`W%1GMz%L%}#9DB=GbD=DNLfasV|z@Nrv>m#9C+R8_jpw zM=EdVm@2|hFxCKUWTHrgo9!D^*{TA7M*HeOnJ1&KyLj=aXg7lRZ8qhs9+USg6B6?-~ zUk!T5-6D2-A)xbG&{}akpayX~p=`c=qWiFRRIm7Q+_Dp$=$+jUSGk0Q1(T^{I`ZX& zc>L7}AF{ybda->{k=GS3T!E3e9o-j9FpQDH7RaZTIQbl793cWv+~PeWmBOUyUcSjO zWu${vu|pw%rG$5tBZTMxD-}U@Kh3lgB)MtP;%uv5`wuG8(8HX2E(kNuYBL?hz8ekJ zs3wp9hq$*2iaT1j2NPTxhv4om!7Vs6?(Xivf=jT*-Q6v?I|LdhxVw9B_u<@AHFf9I z{hxU_w`Sh^!pySH>p(=I!w^qjgBq!(pz^%$zIolbzm{|VPeg7|4`8mxc z4Gas+cOO(7HZk$l{7UI0YpK~#8>~VyC~-6zl5m+H@c>ho)Ubpw4%hnUu0=hacK!x| zlEIMUGKY$TQlG0#!JA5-zdG+x+3V*SaSVpDr6@i_-fm}qUe|8h?=xQB&Z`$bv2XL? zavY|xVnFKW-(8I6VhjJhHAcPzE*eD5aVtgza_{!fa5K#8g#zHigDkO(*@{V-gp*kQ zC_0Kv&CrS3Ehy~;q0eKPP^^B}NoSqz+XSX1Ga3bz`sU+!XMysx?b_m{%Vb8JXpDs~{{ei=B9ECB`m^hWbP;TxXruSN8VcJT4ZkM;{U{Kzyg2 zd1goYR1vPVn~-Pc&) zuT!m4^ypR;1edRW{<2iAXLG-$#zoRAesH`hI3qRf$(Ekpx#80*R6;ZWN=U&q#d9juv;M zvcX8MSxqLOhoy6dWTT8>`xQR8oR6V4aT;S{zab+ z-54R!aiJNN+UPh-gTSYHS_0Q>Gr*RYOK{Ihbreo`RufHX${SbDpE84CWtC#zfIm5M z!O3>w0#gOnkqZjqx&G_Lf_WJTA7DZED}sh&oF#RoUCabip#r_~mzx7n;|Bxc0LwY2 zHV!gBCS>~BB*T#meiP>}WNX@}HtA|(+C=fW5$P!$O|4v7JDWChi(U!sg``r^b9FYQ zVgU*+#ZEf8BgA!_Ldh}B3!q7OyNF4Yo<{H}c`5Sll zka+0};U()n^1+$#?Blr^@^q#1aE?b7V#Ei^JyAyUM;3fvV%tI=?$6yp7C5}pS3joN zFSjVR=h)v}Z0(EJEiG#*@)1o<6pES|K&i}Fj} zk`)!;TpIX?cf&#vl3T>!i9Ls6^fNCwFNBu@SNpvE3l3*e2P;KKPt6UJuIZwtF$s>V zz;9GGTc+1PBwJ(opSwpNMGuyr4>JLX5w2h0zq3{_8ga2D!n%_u+`HV1KY6vmke>p^ z?%n#XT<%>YapsdCMAkx)Eq&;ae8FWutlFgwV6`LTHE(_=f9F`0>ZQ+DZO*zV>rQ$#MrfllQQqk(>j3aVilVK^ps$(~$ zrGRw>&D09c#@3P})#&va*NEeeQ99Zsq=!y0KY@Kv9C+s50rRuxz5c@1wN<_ zSiC5y_1;R&x>CPmZvuR_zHCZAOouQ#s1ImxPf$)c?_QS{ELcF$6bQ=~WR_|Rj#=HJ z#|-e(aJaZdo{d;#p%F-GvAE#w^ee>=H&`fk|v&c#6Cn?(*1 z*Mxx!FEw9FaR3i?zDK+@czTbHKy+iwjD&!KKmbIN`%p4=Sr)I}P-=0;wY zu1Jqm*9yHG)XNX91y$@@mMD>SAnFFQVg>O5WGcuW6gl9 zOJYn0ZXp!j$1hd0cgr$E*2Fr@`GHpi?J4th`HSyxe_O|OFuH~?AJsj5`50FwCCd8} zW{~NCzdDe)%n*9K9>9i{{oITF5I)#JUAfmIL4xorYjg=UqN=zhytN6Y^_)@|JVjai z64e>84=XDHdBloat*C8b;a7+~tlpUU8~59wE4(&;yts9R@zx5b5H&&21oWu0ux9)T zww@JYn=dpFiOU$xC7$dGVPvUK{aHusbgw%}g6p0ZHs*HAE29Wa0bHiRT zuqD0t^^j)TAG{MXQFi?;E?xoNpQnuvipULiXs(S*^1a6L)}-~(n=7L zv)27d6uikZ$W!n+2ULG}?h?$4XG%{QQ3q11d(?L?8R6j6v(8==#8^yGSEdHRQnj=(N@32VZ>R$wPu_Q z#M>?4${#R*)#x*-l&p@QireIse=L2pU8FEs+rWr2+-EiAmHim|RVKc`T8TGyZy`JC zVu3R~TqOnjV^A6(GCvRRL1LjjVC-CJ%sr}IbhcDiuH9M4Lq+^7(xbs)#W>2AX{%?$4oGhYvn0;=F7CP>L`uxDF6hlPc^_4nEmaLbQ&z51hDj`B_waC%P?a$<`E`}Fu7#s%H4(&pg8o29R!R?3Atsm7Uv{%|PvvjQ&+|Syyxv7q1lWvX=_!TYqd+aeM{G2?U$K zvEi;WWq62G)jJr>YiXP1ADdO~?NN8&6O37he`+N9Sy&6R3A7pRN2fcQ0qg4DGW8eU z)dgf@*kHD<0j|}U@3?iHcq186Fj)*C=AmcU4z^KSZ|`#^IQGQk?BGYyTvpwqDJpPd zHXkwgaLY436am~fHIi}GSH&^lP~|0Ki&a(AQO7d5s9y0h;Dc{aaI28ZR>j4_= zT+3veF1=bviLSqinm%C&#W^?b>vt!Igz?*suw)?l%||$-hnHl9Nx@rMLkN|4X$O@w z%NZm|fw);%!u$!$JjwNfQpnAMYT=%-YoX(bLxoHA#tAJi{juka_`pu}!Ex;X?=pO^|7yuF4KVooc?ZrfdWxDv#VZ2^`LXU!S8TS<#7q z;t}`pE1ewxnSF_$e4{rZpJ;ctT1wJ-q4Uv}M=4%Q@T6vN0bB9JAijoJLsGh(GQt|k zXL8n;W(#2}#-*qVsd?=i9_Al@?r?K|WqP%$5>sleJyq}ojp{by0#?YUIs?suz(;`QbzpwTv zmN+9;)@sr!p>F$kGQJCz9XxC!9=Lle#%%Y%zJGeBiE(pHVPBfn7V*9yb+$NPe|$X~ z{F617DsO}|_+CYGfRSf48BEBtDz{A}7z>#qDlDud4D3M&WGkz7 zSil4vH<%rb2Mw32b^bC;%KHxb_KR_z?x|3pkyk<-rwPk)ka6^jF5T6t%MWNX&_m*B zB;SWGhh-=-n@Q&^{fs?*&Ehc0d~1&w{o4_xRxT^9Yl8WFX_ccA!wKbMbe`924S;n3 zbquhNYmDI<*3fPakm)|I!g8^Q!vmBVO= z45NbvajgRFlrJN?_95qAb$(VK<=dt-XeqFpH{((^LkH!yS^7Gv?+%dbRh@bd(nsq} z5h|Ia9{yZOM4sBk4ZO?DV|jV$1{#9pRWdEw{ZLM;p1redsG8LqZGxXYm12c8%wsE# zerIr&2x{c%v5S7~?2DaXXSis~x*xEbDQ}38(JkAC!2x&q85*_R=5Vv%748pp*ua~} zP2j5qdQK9!ajPkPKWv%(q!5&0@7SEM@Te4GoMYb`V7#_oI&YYDEx|=* zuV?>BpSzhfs-C7J&PEK+ilqx?u)@&gyz$7=j^VIqD+eVZs}C(#j@FbKKS8Es?4GX6 z+JwQT3{QSBOFLd4a~0BEMC@g)n7bglY~+Cs@}}r`%)q}H&g?KILy^SMf5aAT>l#2* z+q%ea=_}vuEf96W5mo382ubvKa)Sl)W`=rk?3+mK3d#+#0K!N#y3 zF+I<8#w`m*ix&r2;5B(ZBBsqTWQ^Hw4>)HoIJ_@=?p?3dsL;fAt!~X83T(UjxnO$t zA(j{K)5NXGWS@vF7d|4^o1hgOa1UcDj=X^19Zs|zvo;JTBfbWs@Vg&TKk`iJv;q12 zb(-olLs;lvpIkwCg&hjq;i|viLtn%aXpmj^efoy=o4Q`%10iw1F{IH7_}uY~1i+lY{n<=-J>&J_TO}(}))*84ag7G( zTW6Hpn(x@TBTKX$TU)=lqqyL|2Lh2&Uuec-qwNEJvSNz6*38IR|7?D1sEh+%x$zC8niF%5vqq$uzLwF4IbuWHc7zj@xRSlY z_I|;cnhG=!4HJ}5aQz~>JAly#^fKDSzY1qy;+JqDY4_gIm~h_=iS;s=GdZ^j>#Qbv zHk%LzxgBxoQCg&SXhMcmK?9}Sf$jlfsXHqmOp0S#DMOfgIa(T-4k0q zStjs*fUut1K`oK}skZ0>hf$P)a`izS)Zbr_{z37$>+vsWd=!=|qy4+1s`7sb@Bh_I z{@?st|AOy(nkTLwiBxa$8K&_plc^ARQnb@Q?GWU2Mv4@BMC{6vl`Si2LgnKV*ka{J z{y@RgtsC@|T!d7JL%n=Bhf&{dniV#k&W9U-RHV~FdZUyTjT3??ucxC+7Uw{}=aUqJ z&ykzYENvIUp+g}?Vh&NQC$fUZPJzRNvVunWtiX_|z(1Tfr1&7Q=+EkytEvt%zb!1w zl}UKrWZKJ%uF`AcwHxHtGOtEI|gnb{&CM1|7gc`8$zp=Y%M8Mt#67-X~&5GdG7)|eTS=64fq zO351}2F6t*_d1Ju?SSQOLpj=(PPE*5EG0kECJjyn61Is!SL!j&-$UX<{p}yNLao})5@I>TTy@`E| zAGp_<>2LN6@&Hk5_^|~421;XQT6g*o$=Qs?wBe=B{FvVj+lRnj+PG;*Ny#MsxA)3A zJGdZXN$)%4^YJ3-+08rb_UrfVAx5YJSsq1$J#6*_-cZJ|HmB+esf;a5Osj1exlPsg zpM&YPY6jsl#>cpy4;V=P(54OB6#tp0<(oop)Xq{?qiv?CO}mzdTm|CDX&ah~QjaaM z`%lR|3vqi9TzEAO{J{nkOrNMKJJl{*^F70sF1gNZ%Zf%2dg$-*Fqu{8^yrbcy%|7P z7G0rHNAR5?eZ@6m8`-5vV5J&NC9rS`7zX;U`+X`@2g@hI2DAq5KsJc36fgq@H`N`l{YVQgJb7K|V zL)+(C&NL@)!M!BuKX~#^!+*Es?BuAZW|Hl!ai25I;|}5=W}+9HQCJu;E&1g-z8Oc}8ih zFe|U;Yf=xJt?nwWCCNw9nY~ygD1;=_tfyZGFqib~%enN9GAqOWy4St8H)gyeOYi@2 zt8Bmi*f_w!v~pF4_l@vgZnwa|I6Y^ud;vMm|o!T3v;Ai-=}`UJcDy#vDOO= z>^-K<$o5s9#?Npa(%wG@7BV@G5yqvW{O6y-&VQ4Pl}XzE2_Zu}W9$pDl&FNs;+C%8 zu=BJ5FavnL2c5-1~Hu44WPtDOhl6%NMsWk)~t!V5RE_X!mt=V3_1uAVU|A38afcwk4CI!usE&0jL>hENci_Hj0B+FlK5LE)dg+vi2eMBT3oL} z%^KoYZOEC%&(6pPda0OE9S77N-5Ty45{uoWvIYoghaWWehseFy?%HZ&TEhU)0}@$sCnF5 zsP`itP5e{Q5d}f+iT@3g>!+3^{Y?l5dih$KjG8=W0_(lh?9 z-I8Az?tAY5uC`ywSQJ#=4*hDeM^H-#GZgTkOX%VIKekCeT-bd7$2Q^kx5USPl70A( z2ZMjsYX7%&@?Y`1^55+x&FsybtV}+dx6G_u&7A&+8i-B}9gPoJ_8YRlEE@pT3US() z0ndgh_*12w)v~q}ggCfpl|i2mh|Kcwd@x)X9>YZJb1l5l(V@E0(I6C2K8l@U^QiEG zaV+>%MMPvYVCaf8&H0Y!d1d2mJliM!+q>@#&hJkQ-vV0bz#%riPo8=M@VeLqTjr4@ zN0IU4xOy<3C z?Vf4bz`SoJ4)oc2&F)Q^6V-#)N&PL01Ucn*QY`M3Se2M~u@_$g6SrlowVH7f9l@LZ zg;mMY9TZz%z_pQ2!=6#?LE<0`W1|2adh@REQB|ar0IOry7c0D=RjIs^Tu?RwO{xAA zV61I`1w+vI?+}Ej$@Cv*bdCaC@4AlUy?!2!@`NG*lYLbmVMc4?Gd%oYTL3lmdZAUM zW4z4h*agADSv!YG!K5@^)?m#?CL^8qp{%D(Zz7}ILd9*1() zTZXK+n1p9Dp>rU80=+)7iWM5?i&>loZc?mz`o zzDjNSL@9H%&hmjDbDGf;+GIU(b;SoBak?+ow0f#Cdt|J5{0*K^EDnk#l$XXlf>#w< zO#2U|RKGg*fUh_3$p{~LfC!$bN*Da{5mR0WypyzBKG4L5QayI10Qz^0rLQi6q5{xb zieqb~DPj1ssRw`fGMBY-=L<OHTwzS+X6Ty@6szkvy!S!40qAsURBEpZly$kgP|H__%C zDLX~VmKWaN%ACv3MoE=cgn#k7LGyCaK&%N~W$>tY#8J(Ph_EZn0F$@e-K(Lt>q?zS z_oU=OU$^wUO6tn_Ehx#n36!Yfp~?f z?D=lDITJmK?2v)TAQ9jV8C7stR03Bk^%*)Y`_PA7ASi_t;~DZThjdMJh0{C2^uCWK zf!K!ak;v&HL@({8<+B;Wlq4~Td#vN;ZwWQV*gDdZH=ujv5O6#5o!NSmD3+e83zBLpc0JyWbMgt`-T3 zXuB2W1$4(qP>y;egn{M(W#E9H)nkBGXhHMfE~$e{?MPI;1T4`D7u4;C)@{IO4V!)hoHR`@!0bBK^B# z{eRMa_B=?CUo&RA%Sz^L=SdX08Q&XHd$4pk<`qQ=KU^^GJM?FOb~ z15E<*gynA#Ev6&QtLeI?|*cxvRlQM31HN@~O^jBfkb8aU~72pLha)Q zhoB_#-=t2}4$>%-^syW>7C!v~tEHws5%yfBo z&=-}1Ueql%G5~c#DgUB~RUe1fPqGNgr$JhODz)~FNUNRn8YwFIlRbX0bhx2(mYQgr zwQP_C0WRxjx`yA4`oBcxNrlr&#c^G+BG>ZfNSkA64SK)J(o+}{u$ zD$0x0$T8=GTGC2P-aW);-BDL1m^CF*+ZYdJRK|k#<*zU#FUDjysSNl!i6skGtRW;s za5XFmkauxNMKG_C6Hf8w4>`cf?9U8vb{Fo6a0m8`a!*`_2WVX44dNrL_vsLPS6S@0 zD%~W^)VN?;-*Gp{_YpcuS{!OAI3g{B9}Gbd9H2&M%FQx*c?bGMPvC&woyo6S+pc&g zF=`2AqIjQGGh8Kx&z!u+YqpryL)m@}-J2gWml+cnu-vTPTPb8(wh@)jTBJcr&pi=GSgkn$pjp zs6jodgLl~@%5g@;0#)V~q@Jjvv(olRr+M-tv9YQ%{E8U8it(l*ZszU#=B-}@-n*M+ zQLRKeIkxRUflzNerWq8l-vWVKjIp38{}y4<8?QP2%;s7==)vss2w%W7|&XvsS1HvYHbuLnN!3aXx=FOsMuW?8rBKWkWD+&HlVi zX-DYO-%rf`2~Ye5ssg7NFWtE#eu(8S-T7gE0p8AdUG$a9mI%ItJuHyXJ1tlL#v>J9?H1+u1@Afvcr!3oddpSe5ICB_ik#sY|m2Gcd_~ znAENjzI@11>&%}*Fd5irSZn(tcp`+OPTE+Combg|%Qj6wVEC@q+7=~LR-i`L2g={6vTL5HWKLkC|F(&U^6v3;Cmz*$a-q9I!_Wq{DvFfo(qz*db$mMh{ zyK0yYlKy$UVoJfpB{=p(7lUPnQKV1k_~o03pf_yAVV3z#Z5;CqJZNYaslN2M7z9q7 z-e-OioTp>o;3AbU!4=c`nD7=cyPcy37PvMsLNiNGPHk~sDqz2V z{J;+x(_p1BPx-p5;`(G@L~=6X%DwL3SvDa&d7PA34^`lTJOr>dwVRRVBjO;giR6!W zm8QJwz3e(oJuAO$*P+Cvb?~zr`!jub!3r}w!h?H(>YNT2UGteWSgEvo-8$b9=yF2h zY?_Q6dNJTXkh4w%`m2wTG$X@1neiY9p739eti;d6JDTYJozrP=ZGSGYt{nK>o`K{2 zW4_O!IL{=4v6d4=$^g zeTYWT#n>QN@wrx-L~;bf4%G@8wa^iS3S-+6zPfcu@p2P^SLIOl59Sksw<;0g!kI5BWf;o?!Q*mj^=hWWNK!X~E zTBk*L43$HzHQ7aYBm(Q4=ye(~t>8E8S=gTAjM>wApxFAKcCJy6e5K>t>(!FZX4}RY zPeL7#$ySn0{9xL;ej`BdVj&2jta3}wvrbRR%$KtlL{ucGc7L>WC6CILw}420NmBaX zqZS=Wx(^-|yBzm>q&JKCYNdpm)v>2@$;>0neK`ZZzkf6g!osQVDaj9ioW~#jtrs%& zKcw0JUqIH%)6De0b0ZZ0AV`FrEIu3r_AdWGV2b}o>5;mTlhyx_u{NgR^-nDctGX?e zqsK=xL$jQ!aV8W-uE(sEHj&39o-9Nj@G0DukR+B;BiTxJrs0O%q1VLKXQl67lwFI2e_V@$yuUsr{hrkBiS%jok?a^i}YXj!fVA1N~N~xxvGQ_E$$D zoO05AjK-D<+PHIzooYlg%-ixk1RQdsN`zHoNvr%IgP1uqX}NM5WxI$~kJM2|uRnCD z+WHV_yacD;LN|0*U;T0;Vx@a5Dg&}e8+zI-=cwW6q!jD>ZI{__c#j_H+I|fn&FMx? z@HW{qO(&}~m<3n>=JwO??Vu#zy45wZ+L}4K{6^Xv@(5quT+piK*CqjQdu;1qO5BuM zk{vrS(~dwlGw+`^Y*jm;NR+tP+E7Yd-ej|i-?4GQv|y3wEtjHK6X>>Wz#l~~4CTmFC`dhCF8E{wvqYKfUHq&+JOIvD044-C2~-9pbP{WEJu zErW@K0xzzB(wZXW9^60Xr(#{Dx>cjt;#)W-lW(4dSgM*S7q#WopsnlETh8EeVe3-Y z<=&C~5M**%Q;MF<6XuKjs{`Ouv|l(q%D~$i#v;`wjV0|bkJ;I zY_JFAc&2<-WGehv`t0ddp%e6>b=B8)4_*+z4SWGF&Kfyk#;1!Z>Kp zK7S(1GcAA-lml&EU~A&!nKNx(cUa3TnTPg=X1`se7Ky!6n3f$>8JLQH1ElG?2B&YV>!bUBa*^N*y<6j^`J=Ds|`vGa)ejFEu`=(NJ8KY z^qXgC;Zd7ph|obt2iRHJ*<8=<^C~#e+Z>-X>9bSFvNa%r`I|MuTgi)QK}<#;17a7o zvO3%BenvUr#7B0|gvYbNdBbW!F|A{@a2(pt9R15TCAu5~*3 zM>kZNaWuC*@C3$yrqXPvakX&Xg|!^(u3c5h6Uq!ge4N&#>{A=s6J0PICra59e8HoS z))T`waYQxPTOX(Gh=b=sKDfbJqh&mq{{+WLkSEvv^T!pVrG&muoYtO}Qg(+bLzM>LV?73xkTx;KT9pSbnxYvUvf(re@(tu`iGacO?ZIF5 zzv<^8i@!i9Rh))jR}yqW?Z7}28y@dlE&CM1?IrXjwY{b9q7{LD&oD_Paa7YkDAf-u zNcifDW5?8{+rzJ~xcn~5I>UXzpAR%BM}G1=481|gH8jOy=AN6yYY!Jh71B41P&D$r z#+K2ckVb8P^k;Hs^VyICF^Dz{{xR{4*o(3}AK{QH2>)*49sj?b_i-=O&CC(nXLoM5)RPLONfXz9gRc;z3J}>2hVq7RVR^CmDMnGEhHeVBUCVF+5y(?&f5ny1V%%!}t5m^~T2gr(Ar45z8K0E>3c) zQeiFukZFaat|Ay+p34NPfQ=#(ZB~oR)kId2Ibx6peg}Pg^ukbaK%#>VW7=lSo$$L< z3yG+>h={TT{k8}{rGLb5p}Q<_lA;i|kS0g*+A2X9ck)N}iA*`D2MK-#KyPx~*qbJj zEZG|O$4X0O^bp+zG-qrSo1v1Xx`ZBRa1k<>$vY;OJyUf#3#Z_8$~FOy2~&*|y-RgH zqswKIF03tJPAMp=A$wp>p~T`rmLrWtRyJ)c1}FK8VR>Scy@Z{7aSXM3Ib+OpI{AeK zO?YK)6T%)E`$kHLc+zEzzmH{F-{NmHD`=ogHhgY0fiDuO_wW^x5M;s+e#G!mWoB95ycwtAvD#HZP$RvZ=xuZN!IVG;=3STk=eLR!p zcd`XcktlnQY5KTq4#U3Jij+QAqm^JWE?(9qn%+d}uSL<4 zmI7(H_1WoktT8*H*yxQAv?B{vj-^jPHBLjBmaLHoKuUaX-6^Erb_J5RsiRku_5~#-p z=8**1L!Ta^CYBk}H?ivafry~WziYvJK&RBo;JAqQsNK-hY^Db^JLvVSw2V6(;Vuud zsQKB6;;#9k(5qGYJmm+tT~r0&x6p1S2duP!Cylc@-Lc90hdN6(A-#uc_Gyo*Hp#vJ zIOMCx*tSDG%kHC>JRMY;(|$B>&^-V`aOLM+xuAD2um+VP$3~!A&;>0P>!7|LZkJ72 zfO^`pyMvf<$VNL}aP=z~6YJMt)?mGCI#UistSqtBDxEzz6Gt{}Erjmhqb$4x2Iw|o zTek@+8GO#_MW^0OAVpu5Kmv^#sww7?;ps^YWUkqCP3D*y)a==GYT?;g`N|(IScv8wmDrUbvN#R$6tNhm;yQn-@(~K>9Hdu+T-tG0y!rS;e&~DS=j@NC+}b#l5@5D z>fTWTo-i2Sx*1y3WoidO7>O*i!m$F2W{|`r93o}s@P(I(hk}_gTgIvW&+7zDDpF92 z=J^u?g?z~bE}Bx!@W8_p`hX!o?S(>Ym*{mTnWWJJ-brsvZNL_NUX5Ai7d$X#eES8z zzlG~DW7!=V4FuEB=O;ttp$q6lwuL9#ucm*CHaOWVa_r80M_VAdxv{%pMla+IbNmxk%pqf~nEemV`My>6+l4TXDA>iwBtX zn&xZLMjAJQzh~dNLBz&-Kwe>A8u-t6f&Priy-`qfCXD*MXrnX8I*k#L z+|s@(&CxVZcI0I91c{i1t;>OmX|QtQIMs-Q4&LkL;bL><@61>k3X5kbniC0&LOUMp z;24=iV*9#fg*)0s+1W4gmZWr21!A*^F7cg1h9xR5gRI6;MB0AA4|Wvawp0&&mZKt~ z>`U4Gh_AZ;v1Xckm-D+ncu~oJtBh0m-(EBSvPe#~VZHI^aNqs(>-L=gE+(Hk%frLN z*qRNEJD^iTMP@+-o>DXon`TwYki`~}471C_5;j2d9v0^{Kug0HB~oFUp-Nd<qz4gDoWhvo85Tbn;yx>6G|>p-e|o0x}AINtn74pT{Y`>oxuI1;!T;vV$WZH+bW&< zwtJ1_+JtPo(s;jwV3;Ho0k$!v2J%QFhr@;0r>ErVVm1qOa@bcUFHHx^7_FlDf4Y8>)EHwj^z;9e+3AA?i|!gha)h&(IZXUO7a*X?mn z%4#NJQNkwI^q=mw{E6CIrh-jI(>A!3IQm@{^f)L#;6DQw{v(C5!ixi%IgN#r$pUp& zsYDCHFIEnB7IMv2Rm7uY@uSdLpk-_YAL%)8Wl>5zkTl1yd;?ArZdSMyfIpSzFi9sy z^XG?s1|UcOy(xDbF?DrSzFk6B1mf+mhKm~$?(h};Y&zsQ%AUwj9xDz_*M_h?*I5}6 z_quW^PD(vPxxyi>AvAWCemhHJp$NdJz_pAZJiEwanCeuBHYbKqxd8U<{AO6F%A3v9 z$Z|OC#!`uYO0FJF`1iM+g!|GV{We<>P(b)LJxR}qj(_IY9By7-F0)?avq2QuV8kzx zrDap}LYv3r1$7Z7pQfMk*pqecd*wmhiC3MofcqB>McBVu^~Le_W6@K}Bb;ol&k``yC75T!N9ik*Q^ob+ zDWKcL_s*w z`auLxaILrb=aQ3Q{6Ux%18K(l=+N}F(n8)uWsTQuQYc=xL%AC3gve;pO}JAnHT!x- zCZN;&JZBfOQOu6dd|54+;CM}iZ34MeeLu`uu5CGp+p+xx^9GI%JIhHpiGGR*!GbQM z(Z$1*txAYjyZHLsoyK^clB2v$!WLbU4i({$hROCvhm;!+8}15}QJq+Nc#m7c>8^9f zZMqH(VXk?&%=>HjDI#iQ@1LD{&)!febG|lD%xp0Eqj;S352%8=kto~b2;=dY-->fF z^dO$NO(>5VgCRak7&l82v?O=WNA(a+8F|EM3FfO^8Rl;CdQXQbY^os410SnW_GAA9 z7h$f_=-uE#3mjtE2$pXWz@IAB2#e&X)Br_tG-|X&3>0g`MGRCOstUUmdLEtr%KU9s zrRPIcaUgYJ_4~=f!5B!$U6@M@Y20Jf#OW#__w+Xy_9Dvo!@$J0lFMTolhD$Q>5adEcG5M9 zxfs7qFVquA=K9f9;+=}klfZw~Zp$uloESj7EeWwTh~Ui<)b!1$N$D$VL+y4tiyTT- zgYV>zMW!F|InuJ z9okbY8^YVfI@$F{Ea5lkYKKlye6$n;^#T3ZQS@U+=-48ozi`8eY1{L2n64#i(PxS* zG=2i8vQG>elW5l^2wzu}LDhWW;u0yN(xqJNm_#hmPTv#6wUtP*9JS+AwCmPfFN(c zA^Ss)o$|%6FiM3Kj|guw${^2r_?JW;{|L5XrOWHcrVt5c*kFnX-X3;A-0C)0RcPVp z0dtPX*S@r>IC+u|pLmtG($9ADpVIflptBCeaIZ#3kYD-L$SdH%!p{fmYD&(JmHC7!~-D+6*| z()&jLGND!nZ#PPHr1#s@x-+6x7rk&a)t60qbETa>?tA$^>RWbUr=6Q$kEMQ%CX3no zxypb%Wb!?3X;*u|;3v8)He&HWA)DM=a^hy2n8O@(=Etb+!bi(M4CveZD`GnuvO>6eLpZM`9w+Gq}S%a_FjMvx>?;?lAnXfo3I>Z1b8z^(Hts1iz7E_&_xl@&F}{a}w9a#PYr8%j9H)sgBN~ z=>qk?gYCvGz0NoqcFOcI1izn+TeK@}9m}f7$JAQK=BlhU=Au&b+H~ixb*%Z_u56KZ z2zn)*YqqYem#;^5h&aB1Z1}B(0qtsokTjPBeI+I>Mkvb^dLe~gfyYuseDuJ3n8tk) z`?>_**@7%~LbPtL7Uh z5WS5a)IL`y+LB_@c{OxvIcnz`_O<}WsAfG!>K##o?+kq-(A$~1raYEU;LIE2#SjyXnhAJ1(AQ{I0wv5I>~~`AE18?N2y%WP{+wYA^V06;>ZY*^*G5& z6>3(&3yhn1P*F@XYy^opVWm!D5Og79poghiijW0|%Suti%mj%oV`juk;q(WI{Yp%Y zm5QhR_<6x>Q1)&u8wNTpD^_CzUblJF2y24;;CGx~LIRBa-!C!gtjOtWIL6CEFdW6= zZ{dNQR1`-tQqw81rY0is*XZ%Ov9Y@v@W78e27VsqV!73E#=w_^AJj|5Z^Mqg_?PSl z-z=Dxms0!e7$sNjeXBMtE=aO>_SGjyUs#E~pvk}PiXr`M?{ldptKGIIe+eVZPTNKT zhBtrh?=DfP_#<^m{6Jlej)`4&(w}+F@)3s3`x9G*R<>TzK^nmkvh%kI^VVLAt&E3Q z1+CnO%b@TGkdkXuq{>B%WTb!3kxf4v&G|8sSWeu&hU9=c_OYF*DhkVk1*?^o(4+80 z+21Oecv}jFwzs(mRXbh@;s0Xo9it;%w|3zqope;OZQHi3j&0lN*tYGYV>{{Cwr$&; zoUFaS@0>CA*zfwY-WpY-p8KhKeokK3yyj4;4r67{#l-u%LumM1r;`RLU7R3^16)nm zogL-vDZnEQHlL!2CZRM@ND1>4(uK>EZ}VbB?x20AC7|q)vGj7##HQGJl2>>RQri)? zoBF$HxQB)ZI!Xq2J)HaoE_sN8NiW&O!AU|Gl}VJ>2KHDRhe1|NpEsv5TXE_g_;5Y= zz~Mb`de#r~WO1t}O!jq4g>#({2Uob__MZ%68zCxBqR$&gX{XuUyQ&2thtparww#m2 z?tlY`r1Pq%^2-AtshBuRMeA0tdvu28V-?t@L1sa#T4cf1;M#zwi13_rqYio4ln$uu z^1JcuJ(at8&qjXd(jbet(;pGaA~Xsmr9~ELoDV=W%PDbForpe#(*@C}w-Wx+W^vRn z0G6@%sc8fCTMP|CDPAEd;}O$Rkz~){TcGtr2ZZ z_*<;J`z#Ht-)=8&2&%`1UnXw|o{WSyxnPa5x5lrq6h;IT`}5@c?_gcpdi9HI#vGRi zIL_C(VMnobk^(5b%U%>-ejSMIIbVW+F`;wj<%TABf0x~VB*x`S%kl8Wd`_E~#vI>{JY8yGwMHyV%1zlG3k>Wn1nNOoveWdtk?Gg1U=Dl1u$r2-c8 zAQ}bcyXqupYgjhu+p&m`pG7_cKm5Gy2RVr@3Yj>)ANihD=N;KJ@#*^b#rXC&9jDG5 zCwY!+KHlF3u7Ea!al7$1?}#GH4MswZNkc7DlWx4>ml)9czc^8*yrFP*O7eK$Zx9>| z)FHY`V=U;n#N+gDA@)!4wb@x`&FbR2Hsb{U-=)=9>Dp`@ zLKQ;XbDXLyhCJGT4UJ8W$A{U9vN`=s)@Sk7IuFUe08LTTkF9HjB7i<{4nR94j54nL zK{6@drLtH?mHsQDek}1EW+VOvGJtz(slj8xMBX8|XTnOko?5nU4bbOqT~fR54kzTV zxm=#i-yO>bup5s;INPCHyojPiGY6L;rL}wWsWh7UQagUAa+JI^;7(!pMtVFE4YFmb z!Cu&ybtQ+k<&Hz5(HX;FWrL~In8tOqXrFQ0wP6EgWD=*P+!8822KSuKdT`2x|H!XQ z`c2JwBPK%lW+7E1)M~&kUY;HV#9!) zSp*wt@}Wb?uX!iqw_p>6SIM`VaRhk=Eq9S~Stw`#3WTn1Ynz3# zhvfP+H&-Ml7aOi7FH4Jnda=2}p+4jg8Ymxv52yqNXKv_pbc;PL&Gwjnq|Vn)T{4o1 zsA#!3>i36uX{M?ZR*3w;XDWjnHzp@3b8w zBiiD>**^x&qH^KnuLKmY`l@-meP7}GPALZ^lC4(uU^2n5CHqZbN#NbECH1a%v1h`m zBH&T0BPeCL({(h!NM&(@lnGynKt^Y@EC9_^P`(!0| ze%ZZZd=HoVc%f>{S!Xx$uMLWQMae&99i0EpcnXU;UtL@3UGIv85qK=O0CuF4td&df zisp=v0&$8iAq*_sdxc#NwB?M3&rPOdw=~3T9-;UaKVu5Pb5WDcr+49~;BGgdzBP~m z`^YN|KRI{32T)-6(lmWQy$B%RPTnv1?YDH3HuXvOmsd+NjWdz^f_%CD76AJ3551ba zzM-YQsqz0zVy{$@`oehNKSYyRW<7dDNxuh$Kn@Eh<3>fUvSQ4KRf>EZZBzkBMVu z!klR@T!x1`Oy&&JZDW>!&Dpzl&O_P@*Ah4IH)ITpkW4@AWu|o|2*D6BX{Qe%972KN zK|g94w9g_qVY6`Pv8N6;B++~oZQU7j=+v-AXPL#6ntA-%8;)ujPoVv(zK#}5a;|JR z<0|tr=@BuZ*!oooVA$HE)3gRln{dQYBAMMTRZMeqW@&sv8&-$X??BnBfm-!zUmWAf zhmq%t`0J*yiQ+tFI$gci-v$BXwLFQFHOE(%$qNScyYdwT!(Pzk>f@Kx1vcbsQf2d$MR%YbE+d8jx z!l9yV&fZ1v@>o1R&3d;|nXn&%)bNs<4h}iilx{c9w7zOhvKCAS8WjDv&=BzF zQ(q8G%jwicM2A6n=gDgsQ@Pd|TU0bIgA;Za3CD}Q->wv6(Q2ciY<8j6R})~Bn0I~E zs@kX5U;)>ON+~A&R#mXa8q9&}OueItGxjVy^rW`aQeX&F!r`sQ{yPN3l&*T={kxE9 z!{q00ni2ZOvkX(y(d?`6a6T&TGT)C{Hw$o}UmH(uFu`+NmS!GptB(jmVzSPuU_!ubLEl4FS(BgqUd+y_lXk2@z((n3+akp5WQ(?~e@c(ck*dO_%xE`o5XT%?P=Gf0*?? zVtz|wqi6ioi&hD$q>Dt+$KvPX70ZsL2k5g48i6uS|I)K+l_obnwB8nlgA26r;8(|r zinN_|CTDi@Hgm%{*H3tf=;p@5T^WZjN!1T#p9IBF)B-jXu$lbM+m+h^f+p^h`N4co z6f_meB_TiCpXD#=gI~;$Dy}cwdM<%jHP#||FkBetm%;QK;Y0yPGNJQS&1J zhy~W>U%@{-y9DF6*}C?s&6BlMxp1F1ie~@-ISa*`1*1=$`-c<6l*t!*j$T4}Rh>2us7}>E^vF$j`eU7TA(tx+xl=9uU zGm+uY+|TKu6{`h0*zza>P@t#GpT?kaZ?K6ZPp59w5h(6_gf#1>$%G%r z+yklRBV+E*UF<*P+a3W}8vG<#ZM6X^5P_X6b28CTndT_T0;Doy_mhzC9LtQOE;Bwo zqgbQu{4QX&C&!E^LFQbhc7*Auol_5yJJcul-L2Bg>O8+IxJak|48RX*<4-n$B`%~= z*mWAiWf09(J}j*b#Kks+y#;(0jk(QTxq$a@M8PgTg;2E#bq+FRwu$CdVB+>s%M2(gu>WaQWI5g#9#dKDLP-*Qf3xGAj|NJa* zuKI;x$mp|n8O8YZJ-N@GfFv!;$T6_rz`qNoc7IT7hL%-f-?Q)0`qS_XJ)>|JeU>tq zp;t>FC>R%|Q~EXaelIs%NW6?aJTcsMr_^qTg1qb*_UVTw(5cE8my!m`I$F!4f5oZ} zxBE!^iOD|d(!GCN=4eZHfobPmo0R==*;Wx;$Ep|D7Bsd8Wb-je<8ep#z*15KNCa2x zA_$f3VJ*aXSMhB1Hn^WsrLv9R9~r!O{x|&JW7;09mMu08@BQRF(`S`vHF`Z235BL> zdv?>8m`P^Jm?Kx3UJA?skc)Xs59yc{K0)8zAGQ)BPNSAOi_{W2Yc3sTP=;ALD+Xg` zk~s_g@vyR8&g@Z_m->zT469wB@1F{d$ByYd(f(|JBU`}FlZBogs1S&qqUKh^@Affw zkt~(E568WNSK^R%!2~dusMK-b%`#u|_PfqTrX#E}NYN5^h zBrbtSb&4y+@4C@mMb7aIW6IzuX+Vzgz%2QY)uFQp*M zMMM@Nqpresn#D?ysl^yq5{0>Two!H=bRG5~c#^p>^amL#(8y3A15H4P>@nuL&w#AM z&dV~sxDxpQdT#vb>cyAlTI$~;=TSQ}_B9sPqT?-SF(G!>jAh^bITj-pYP`}*Abt6oUZkOv4{8v-_}>sxR|E6nOtv|e*gXrWQVZ^ zfDSe(FAAYnSQW_kWCCDt|P}=Cgq~@Ha`4@tRt+6qQO@qR|8~ zZ1Lb$JUFhhnB#f4zTMXvsgu$9!X~5=wvCVZq*FH!w;Y1Ql=R}aO+z#76a?u4_BTyh zyazc+?im2i4D`bn$n;vA#(xk6_t#`Wggz>?)v7Pdfg89{kV zE(MI4d=%!vc~>?5>E;Z8eG%LFwn|lH1u*T@b9v*8EoB?4GLg0UsEKiE?K@Lvp=MKz z;(Ribb7}as+!Ifllqw)$bX(>o0->H4d`~ycL5N;pH#>pB3^yt9EBfbinygbTPDiTM z62H+$8w+M+)%;eq59ELu)KJeUoN6h-M15gl&NAD^hRURi$jB%7D+(z-~#r)W+P>k45cg&WGsdtiFo*)Apupe33 zlx;4`CR|@BjB^>xd1X9sKgWF9xr#;%NkWa0L&c%yCXL7#*|H#$4RKuizvYP`bFYF6t2N_}yfT0?>QkZw zF!A39MuCJzW}qKRi2#1J8Q+{EkFXCvc_A@w7jgmM0$0XZNK2_1>QLmqhhhYbVA z$!icz3fyHZVZkHqbFVc7{Z~W*a_Wgb(~l z@gdWB5ACjg_QdPzSKxs1^Nr{K9WN{{K~Pi}r|@H(QVF(#y*9g-!_$v0%Z0Wb=#3$w zy+w#$r~x3nf@{@AVw?$b*+~98i4)Yow$|Gb@5DegA~YT(J}U4w5pe!7=0hmP93=8G z3geb&9!Z7KpGX})Dqa4zC!Enuc8GtmdxszP=Kt=;QG29KtW=0bb2mgZ)y9I5|0hf|&X@2Qj&+n2eNuR@ygZwqO) zf8ZDYJ(2Rm*3#I9`2P<3{pX$A53VoQ424^^hna@E^wq$sLed&YtI0I$gk4hoF|Ot%I&VX?3zNPs_Xd(cNHkBV!YvpsL!$(YK7` zYntQ{x3-KJ56A)&DZgpnF=Xfxe znJJ6VuvS_ylu=7ewpB$ZUM~Wqz|0w>@^a}&jU8Q8|arI0rRo`4@I<;3x9AD-wCv__a&~OQwNu}r!MK1kBMa#WII3GOLqF)afn369Lq$o@&{qHq#oBUQ zN9&tG`qhg|jz_^;e#7Mo!m<=CBD{y=ljXKwET5R?+Fa`I*A zo{c`!cNor2?D{=&7MSZd5`V}_(qJ_|j+mn)(#VBXgpSru+#y4tD27!80E4Nc!IT;~jAAnouQ# zbc^>Ac_Jk4!R>GaHly?l<7+eu(6UF0mQ}EC}mPT|+&I&OS;`NdZ;q}nP z@cKI;=B2D7`~lfKPJs~pEvR~L$u)~&x@KP(iX~x|&x_+SJ_*ZaLUfBhxG@Y#zqUd4 z3HXc|x)DZ#|8w|5!qX;FGy*#pRLA@qaU+P=8y-LKYr)*H^7>=`w{wDVZ;*naJH4wb zzKeUTg-2nuQe!G3g3C6Hb4A`CBvvCgc-wcELp~u>^>lc81hP|4kAV&mpTR(3RyJ1m z5MK9KSUlagt_JRKend+XS1m6Y8&EPfn_gTq#Z`;~A4(NS!m$(~3*S8Fy;=!lnQn+c z$%|sxumk4lD{R?)aWhM9V2Quv5nhA+L*pOU?}4fezAuH!GR*4aL&3&9GL9^bTn)xP z)3FEYr~fut`h2yIvIY6K|HCYKhPMCme+qx=|0Mo*{NH~#ybX;AA7oXO589P;qm&UY zBQ=PkZozsaeaK}&NO?hs8f$R_5P@z$YD@2;Hw*U3>XH?*=u2JZ@s}RSY;oY0(j7 z7dD=sqOgDkWgX*pje?PwfS~Jvxx<{`S+S#y**W?~)MY2_8HYxcGCji+whTz#w%KuSp=M7{%Z2C1?^H(Dzf#Pfz?3P1f3IcE$h~LaR!SAx9<; zUTs<8SoP8RX#gp>lgWl8ZmXsKI(FBMVtVv4o%@#vFsmJ!Bv2E=A`S zGmY3@`1JE}>@TjF=gfj3rjdOu<~?+ZzO;z+v>%cY?e7S84dz)aA&`V87mx4bhHchG zjGly$x&$NOS|jVL9mcvO2OXVVqN7*MvsDiOva!G^jjwT>kQhXy$)7A*0|7e@3Oo6U zb^<^YYo$3-#|FbS*QRe_7O)#`ShDPe69W$&&~4c9TzN$>mHk>v&>gB%N29dk7AbT{@#M`9UfRnE`pQ;%y%m&ul!H2|KfZJb$ei}ZCxV;JlH}7w z3j4!EnB!e4{lk)8dA!6p8qk5wvT0UoBuYlW5{@ZgcV^r0g~udZ&jXW3r;{J$(=v_h zi_I7!XYw%&uqWyZiv75hlc;vK%u|EwGZ@_No`QoAT|#8WR6Hn+yCwI5jw&%? zEI&y(88dQwnj*ocX$*N-hePf14FUqMMxKGa$#>i__`5qo`WKzo=YRaZ(<`a z+|&kbWFPJ7QWAh=AMF`K|1iQjTq;b$?7;WsX%r0ALQOGJmxqtJVN~0d`;5@n0KEt< zrSERC5OS06r~=Mx3~hp~SuDEgo36P~`+9<2Q+w&VAhwLradqdbc>v(3rNiRSEJB}e zn{dSM!TOdk5gB<^T#N)eh(cQvjoWyJ`6$W#)?}3=nVsn}bHhaw-D;mR2_Z32u+dC4 zdjK&sB3#2&^;zBN;N|P*osS(qfndXk+oG7ldx>Y7zUzze%QW-rOuLAr!xN=vRy5o+ zCqv2|R{+k!Yl2)S(eU64LqpM-4c+(lQRniGZtC~u$zX~Ngq-YO8m?m8m=Lkp4?hPj z=<1beLzVs6)qo>9$FF;25J$-Aa?eBfRXZ>m({t{h5&rOdK38qs(^^e6B<~`FIoC({n}g0(qkp}FCoKet z7&c$7w0hgsgqU1_%>=Och!B?s;Uaf2Mw(ChAtd2;|J;A&`p3EC*-k3=9c!fYoScZi z1D;8iMJ_h7ABpBS_spM^e%h*k`qe#l)qOZUQ#ZiLzvUizMXttpZ1Ra(b7mnPHHAo> zmxjd1#ut?K4FNsUc{IVFma5hYUs&8_P37rajPz97j0-3Vbzx)9k3n$9bQ^=}iU~JD8~m!EiK`=JCT;T9Bs-WnkuKUs#Aw<_W>D9M(v~upCVP z3Ql*F*CA_lMknHobm3RnR!SC95j0a)$yLfDr_erDxD=|c!(2;ztCdm@05+yE80Cy4 z*T+^^+zYG&PQL{zPP7>(NB9~!vQNLuw?u>8gTQZjAS}+@o6#X;$Gzh0xe0v(9oo~R zW5-qgz3s+L(sLuu3K2a-kI#M-ja(qiw0TmyCML+)vHGxG#F!es-v5BC9XLg>S={p}SCug&xcxbx4S6cl_ zZQCH6fqSBx{kMiZLsj@rKPD8bj3~_O5^2>Xlc^6xlNpJm+~bNWh81OvD2VD3;nYWi zsSgB`840A^V}p9D3COy)rBwjpZjTO zl@5GsY?Chsw{Xm3g`2+=yudB(3*zLSW<=9C^yAbno%=>XTR1M%CDpsYy+W)a&a_&6 zXWuTnd1%QXM(ceB^|4y#p@9Od9s3eq zH|lQFY<Tm%b!>S{LRfIt5=p-W>={e1WZ$*>dt9SKF|e<#cOFAccL zBq`fDe)yr!j6w$cb=HOk(B5)p{&>NxKru~B5c9J9(Cb)@hs%Dcv-nkobNpH8oB}eN zOm^S?a%^}+HeO_dMTTurh(>dxl}+`jk3+t8u1!3?-=1KxLLB}Oii}2u#*u_b1Ar>Y z7E(iqGWt43j(y^Nl65@@u8iQUamkhee44uwjrJXSa+JCKN(Z5OYa6LlL-cA3uB=Ac z1Ukp|O~&-U5+!Km1TKrpy=x84B`%A(I?S?b55cIy5UCHtV?q&H^x_?445(jS6erHX z@+-3(eP#>vF9nY-QO%1D8UY@IWh&a16_zwY%Q~jw`%;^5t@Y+7mWxa_Dli#}Rrgec zD*^fQ{#fgAHQn@z4Ccg;bE<5Oq(Qn8%CkIv_rJ-V*F=74=kpDE!v>)Mc}Z=~nnnj#CSI6w zA43DcPazCTP_1++pHv0Z3itgs^-?L!!w=ts8nn~wA%sG_BxjF`02}~Upb5>JQjqUf z`9r575==6#<4q^W+QsO1ZAm1{e-*aA$ic0=U{Y!ZC>3 zc7d;#m-|hI%s;A|L?54?{SQQHuDrnS=vH?Tkm2&%OkrzP(Gfop#$x$8@TF%E2=b>g;g6-)u@ykPjw0$$vUVxHc0=v2DKvHu}Q$67~28bKU+I85&lzi6^nO`l# zUT@WuV^F3#z~3VE4B+yBy7WseL$)4cbzg>W`1aW+cRHksZy$yot6%^>_j$wtwjOrX z+L^P?=eq_ZHz7Cp>T){l3D2R1odzym1%276_{G}QQZ46Q)p~)O?yptbqywSTwH5fH z&1M7U21uzxX*H?0XX3$xPKq%GsH6YlJ3tSS*K~pa0nLN|odNw5jqd-zH2+(JWgsArV+`HH z&ow%4Gn{T&uDO%uro|J(*GeDhlA}x7ePBY9ZVHUc?4OrBF za-l*%N<~X@O8Y$B;^4HsoeG9xh>l^l$zR#&dP2N;v61MzgQCIl4aB=4fypqq)0rum z=AE+QCZ!aVXGQZN$K)I0(1q}6GAM*F>YW1eJcJjGgd|835oGG>zC$iN8nZ}YB!MF< zNt8Kc6rUs;QM8#b3b!+_gp&@@aHPqU3>BzLDWF(#ml-Q7OLE>bTvQb6PJ4ukEUKi> zrN0>|sn%=7`KDk5!n&)CmZ1hL|B8dVC^Jg0qu544JdLM~dWwk|!Ko^5nx=4g%H5;Y zJzJU@?dOpRy;YV1ee<=sAEDR~Z$2w9Y$LTaB2n6ZO|2?ds47VbjXje#gYC;R$jHlV zowkw+bWak|bhNJzB6m}sG`~(2X)j_}Jqe} ztL?nc^OdUC`+=5Ls7;nK4gFoWJfC7wCwLDAuJY7_aO`}U>_ zh?GZSt-or#A0)po2uiU+L8;GyK&dw~XD4njHcie(z?S4P7hxp3TI^F5$#KTT4U$V# zu_QuKFRBrzO;(DyTZi#3r^x4Fb%2!D)6k#Ou5biPQY6L8FwNH$w5IJ`#oJG2U46!s zCTUw83PE>jBYG@~kANe4-=)a>tcxP6_0{)?8)%FyEHbkP$3Zqp&i|6q<#M1Pu^8Oq2*7 zY#pNlgT5Q#K!=`9r3}~i>fR@{m12ZN*oX9@+V37Uh$)BMp_SE-a2*}mY)|9sYM=F) zZkL6~y*D^sm6i3r6t;H{_KSQ5Y#sgvm=~~ZxW2#3*7_`CRd}%gTdQG$l5Lv(ruvEk>$< zyU7VD*J6&id5!bj<@*U6SWUp}6%sD-{IzaK0<^brQ{soWl*55pu|4!V|23MM|LHaYkr}yqRQGk8M6-DB&{Kf?bT95 z_eEq0SG%|dL2TV)iXG~CqP8EaA2co~C3nA2?eP#!aGWPVEK{EP__8Bor1#eKT!ZT8 z;2$Fediux8!cRi}sB2gIh@#m%7scxFu_BH}dteejz2VL?TtIOHe$x{AX$H4-04;Xu zk8;+U^tFtV^@}(B){6To&pCs+iI~!2j3uJtI6M?p$LiHm==Dvc=`&;Fe02D*|5W!wIDxdwLL2Spl=yy}@_op6Cvo{O< zc-{z=DTJhlPMR42}qJAfLd0VX)SA?vUJHJJF*47K2s! z2U*~M3u6B*9aOQFo0CWOzGPKdLP^DE&$1n!w$;e)gW{F3qN}1BR(PFKbGGAp_{MBxRNGFTvFjF5xCz~MU z6rH5A2cB{nWpY}Vk@};sN$GI1O@-CmDA(vLy)};``1(&z>~IP}*QoQ_FXZ#AGHd%W z&E_1(a-){SH;WRBc%QyPqkxR{1p2XQ)dmRvLY2j)21-beOv>UlbSfWuh^`&K!a6L+y$yof=MIE!UU+NjBbGNKZK@G#{wdUqJ6M5pswdWqu z#XqIer7p`2p^!#MH3=Lx#;D~K4_Mj{kKg?WC|BOfN%sgTz!Wl7=zV`e9mXcu>Grs5 z86R7)U`%4ORN%+BgQ?OJiqkPxIQ@i@P}580(`O;3W{ms@VGd4%MT)KIzpl{~v6a@g zxG60@TX#-CQd*(zD?qA1oA_Sp9{lSyYsJ;AFvvLi{AqcEo@|Oia5BR zuW(Lfx|Ta~I+%FwaKM0JX22-u7`+?6bZdBwh#wr^bdcBAn3v!>xdSNp7_%5%_=#Tn z(T)kq)E?GM4J0aAa3+ygWn?JabThz9l)g4b9!Pg)?!M1IwLyIqGh{o zn;UbPaIe*4y&F0$=j)H2)f+w+BC}0P8#q9gBglxH_v!B)Df9yQmpKKReem>t<%EKN z%XKsP2j=vzB=9fExc^U8|1Ww2v5dZziLHaRu@UjVe*Q1!)u^JWG$#-LA&Z5H3Gzc8 znJ8Sbk;Vf4%9mVGpk^Dan5iqRX$X@BGNF+2ofOXr8N+GtW?<}jJHz$^b%@8Dyr_>p zC@v*)gQxw?tNq9-KF5d8`@0=397@BkATlLw_|TWyn5G?=snlAEPL;Fhg1F z5DW&J@w$Q8V>0TC*BULuy%F{0Nh?Xr(P&U_e3!V27wuHm>$gl){p|c=}txJ`amFMl;4fvyVZd6m9^g zvHCg&9Y)odxvhU5lOZ+T!lK1$a->A?pSwp#o3ybG`Vor3acDA1_d#-=+AJ^~{1sP( zdvu32Wh6L={$`*E+aRRs{Qh$E`Hrdy=XgVTOAoP$^;mj?7FFD6kIc87<<{e+X28Hg< zb*5}I7vo7blj5-25nZXM)_#V(DV|J zbud*sb@a|}+0w{2K#D6H`Um`UOQSWeRB(^zV2g`Yf;t8q`aKRVSU?jDY+q~E!hl_y z00_IRZlTI+Y|u2pU|b(w|Mh-rYWGC7C6NIIu8PpCmVR`J3D3UxSd@Sw;N!+yzH~CPvfY|13 zED3YGX+^w0RivDVH4rn^p>D9d5S4TH_4erIW({9T=!qRMar08;!tw0R1X;O9=Ia84 zhz~r~3A~~-s2)@jdy4n}n(C1=ri9S_;<=vut?mC4p6lP+{(m4@jmnx|VrIx6!BrbJ z+Wb)d8VZSJMOrHI0thUl1F1g*1p{sm8*oN<>!eJYQ*Wg@xStO*!bssGNnbBx7_-$E z{ly{RM@&p6GdYg9OuLwv-tLx`u7JMZ;D>?MeRsMqr7bC7gM?WjPMA>0 z5h36vkqbIo3)L8>j~S-&wn=U~%$M4PdrJR!yq&NnypbQd{J>#CgP>A5H2I3LLHxtQ zR9=p;@K(w*NfXwUYS9Ycx>+#zhGDHS;0++O;zjWJaFJ#>J=n>3u%6kh&7iGK3#Gm- zB37!V6UODJwQ7M&(Wp1`h>?ATMvkPAwi3`Zt`li|>N#WMMBzE5j>2g(M_gxsKJj=S zuD&VSh+MvSDIZ6tkGY>2OeWGFWE@8>%qfy#9Ip~tzXjujW(GF#H4TSa_BK3r&U2wE@SL9ckG1fUEgTch z6M7q5jS%Gwg1g>xbx7vUzzs67l8=tlG!eaL!z_J&-6;n>NVT`}bKX`$-&V!Qr$apY z?3>Xjy*S*vVn17_AE)*gpWEVJPUYy3wJ zCmysmbN*MBhI=gZlV&r?-$Lp4+L|`(F|zoHUu1PjO8IXu+PTb4y?`05N|G*tjII7K zJm>e8*^;f0)Wc+%z!5u)jkr&{ecQuDiazK5F8mL3w80P@bQ2t+04nhDojqI*=532* z-98CSytqyLOyUR9M$yxZQWm8-2~H71XbB2TIs;H``)}WfwU+?5*xk7%@8AE5wMV;I zQ5#>ecIj{XFaPWI_CH0~3Dpf%Bvtr-cVf^5%W7;_c^7i1}+n8dc!ha|?n@OTl&m zyzHJ5X%5RStrOS{e0rQwbFe=c*b^w`dXmVVC}{#JJEI|n4RzNp=8Y9&E21W`wbkTL zZc00RW3^ywQZ<$ocRjUeez(J}uEL?ZsTF^lG82HihAP> z(ym(D_HqM+RMo|G$W}kKl#+iQfq9}aNd!1rY791>_qFIx)q-^nrb!FR9l5$m=KP#0 zlq{mgOFUvwjWSXIR;ZL>F+^x-J*&9b=Tf|uKCz?%8)~Ei4j)LLZ7pd&{M2<>Sl?Qu zD&;k9fnuCr?kI$ae3X7tvFnE+e2kBr9ec=7nN>rDpZj44n*=;?d_qD{$dzKXktZs- zky~9-2Cvi8z?fgTrxUZqhDhriE8=(c*@vZe1C|qiQmKh+;1E7yPHLK(Y0OAHeFFuT z*q~K9M!L1-^&%Dk&=leOp6Xe(%hFMmj}!7EQ#dBv<}i9M5JYo;eN*M;J1vCPO8J{0 zOjpMc~F*Y4r5Mv6wYeJjra2y(}}PuVxc z>&9-iq@oNtEhECqmZoewx?|W*u|~BY*HQegD0*O%SGVFIN_5ik>ofUz;ABPd%kPI4!kwb9;WQn%-vVZVOL6KGq9~?wBith&ex&1S{-V*RoKy6{}h`(h+qb@hedfd_YHb&fj+LGhTAkshIDUi2 zmsAQl#y8iQ#>{PGYKv|&+rm68_+xo30=~E%)AY6oAKLV`l*>();n5$88w6sOb#1N< zVKFpa=v*KYk*m!W4SN9^JZ!>!l<dribG#7Fu~LNCfF^ z{q2H7P6vcLKZtJ3*di|{@WJdtxR3C)Mk?D@^j3-r$3l7cH=zAo} z3*^yzAldU+?;VryVk8^^$KQsbByv}c1_YHEkg5p(eY{C@DdF6Bihh zfG(hZt|bvWp$tid$g7Wj!~ z?9&RBd5ZlmDW{pDU#Q#hFhbO2!A!nv#HP*b#izMt=`{8LIE>V_)a#vAjcG&XFiIyr zfMfN(5xQDN&)fsn;_U*~X&o6^EDWj*e7=&kJ}OJ8ruwRkBwkQ}>o=fVE|S<2gApqv zHY7mW3T>`RE@19YNR35vCMIwi9B37vbEQhtazaX?&DV4i^fx}-tV1_lM%DXb(j6uZ zYS>kVcXqSntI}c{mihRDoA0g-rkWKV(fTZ3>eZS+I5_e>e1$~H?Zyicnhx)0_}jXP z_rm_Q9bdf_zn!=9=t4+FBU@+0(okPcF|9D_WoKH8p_=D~MUNz|Bv_VNx@YY*K6CH2PucwY>gi?{nG=s3vlx%HXYft2LOeJ~T3CssLpFK`a- zbOr>Ue8c2s@HTdGy(#zICz~Vz$utuecKZ1d^z#sQ!Q|HkcP9*v_6msU0XGzOn1~I#to=4!V=IJf`k}j_t|5R*(nYJWF?<92Hp2D zYtf{9vT*ADq&{?-EP^B6vEerL z5Pf3E5w6FfWDVkAvH@W-%bF-YBfJ4&LPlgQ^p7N~erB;fCSq=CDEV0^73v@|7Lp{A z(x^7J5_Tp*hTss{7cPP5DWPZ5MJylUDX|Un7SE4;L*mC0&gRLn-k5W_nv-kgp;B+O zFmfz&D+QAv8W$rI7u1;i2BU9`qzK_-5SR$>MRXrU83Vs1ELcG%5%X}C5nJ#);7X+! z1vxzG#aA>Ey+%f1?uK_mCR=h~QSWp*Ar=$59MehxDEEEoYc=M<9E#xJOV0O1w_g$o=K7Z8Pd6 z&9mYm6xYRTH2ZW|sZPUd4DMJ^XZC{RFhVOy!Zb~3w}Ij$bmt%eweF3AMn6q!w}*-a z;{<^|W8+68!#TiT(w!}X3TomqJN1X-B=hDStXwZw3cu@v^144dyTIF|&~~iDFlvp2 z)1jH)wbQA@wj^lB{-=BUgQ}lcI#0=H2dnA!cb!5VO1u1(Z@3QHbkpjXD{@fhWk^u# zYg*RmE$Vuu4BFqC>5GWIVKv+tuTdC@?Vo2Vvzvn%Z)G`+imYAWIUf~rjY)RNY;P}| zpdTMe#N~G%N6-KE;{t87Fs`VSY3u!-*(ktep2S^(osJDJ{$msD(I(j&1V^Bd+U`!} z&kecKmwG@Du60|{VhPd3)#E|^!Wy@3uBn!DR|V0AfeYoeb#tlj@TwLS!=GNSj`D%4a5rkQa4m%1O1klS_vqNVG+R_!i!(t0$F#=+-Wv{o2YD4T;FZf2sP^Ns$0KC?n$ z+Mz0c2{DmI@8p3RJjaJo!w${(?~#_2wj)2)giY<)4DcB2;;xssh{>#n(2?6{;iHbP zP>+V;;IyQM(QIP)#Z)DUv!1RNkEwDyS8Bar%55HE?dxTgwZ-62n{L$Y4SNnB?K^D# zAJ)DxxU#q3vb)pqiEZ0<(y?vZw$mLOC$??dwr#Uxd-A_`YHI4OnYV7uosVbN`LyfV z>sddnwNkVHyjE4Md-OY|U!`d?(oaNL(@=wrIiYr$l?Xah7#e^TAwE%d7E=BVhg=-n z!+!l?dne(axYq9>_zkmzWroa><**1mwQc#jI@?c4EE73TK1!P8N!}@hcVbb>PFeGnDU3FEc|?Is|8==Y zA>aBB*8)sfV5o8Wxe(aaA+l<5YOsMX?3lD>;IHkEAlY)tz!ymUw(As1Ysp!PxxB}{ z;+G#@s^4&)a6f%u+Eev!H-cW4SrIcIZtklcf2HpVU#R z#j-RVS8OQNnMAeRCDD?HSB28k!mULGg7o8o=w*vW!tHy^Uu9E>f=hF-|JtUxp<(ZJ zje`62$dMqFI=iN2S%kwXap9h3dl}mpx0%`*0KDs_6q!p=P8Wl#G@#zV(i|{6*=$ta z|LEqacmnvhH-Nz(=bO`YJ2R@A+kvhM_{Y4 zBa~~|A@bKng?z~R7Tb<--WBW`D%|7|Gb`>Dr~&mlCNwM3`blTTk%2o5@cHv(oUX%f zRn6uCsr%a&$1#bM?Ag_c^fMGo3}vuQaAPY$^an{$IyHlJv#v7aKYH+;vEA86pic*HpP-lANRYr0(uU{kk*e@UA`=(dG31j+-+ z??^@y=7wg`u5O?-hQL3-1k34B9EP>JA$jw>9C)^lE)6Z8?6I1ulAgb5OYC{y9jL?% z=i~7;l-@I;RG*Iuj(nQSjcR(vL^$j$d2v#>hfcL1Dk^THq({P|gz6G_{CSvCC0NBG zR4^N)-MgnmKH3_pKtVoY6TH?(39Fot2gFq~3E3;)Dt?#Ar`s*Ed~$b27Kp>EO53j- zHiGu)+j7?$VjrN0blliZ3)R*-BR&6${`BBE;hlZ=@>r8z7xO^M;vKyF<%!+2=g96x zAB9X3Y+&y}9LQ`Q#0tKq+{Mh$f7J9c-zfVZ^T`QwGpL5I`D6^rzq>s(|2xIOR~;Z| zYvZJEZu3vz4zZ%KmC677ZEW-}*Jy*v)>lyg|1qgT{TUOtojA=56S#=XRUofOPQebt z5Tz*fl{qc`=f zml(d?!ij@Q^+(Rcb((!qRJp=a=9Z2LuEa1RfJj_BP5fUu{P-dgNsUd$zIg#pDBzC8hx z{W~=h3$}DH<@;#RWT2DPNYA3S%)?kD@2y_&V%!J%yRlAvxJ|SDrZ5^sdI!6yFEE<} z#yCsC7Ukz^at1xY1{s7Sd6JcaxQdX2qv+6SKjG+u29lgcrSPrv7&ZIcUNG0lH|19lUp%pCgkE;E@)@G)lp1|EvYLfh_~|B?yz&1C9Xl8FEK!|QtAtJsf= zXIM#8CNRY1JBhODiRMT!PNN}gHV>N(7knl9hhZTu7~R4J+49nxHZRl7A}Ojr*y&lTR4$;mcgWgIV}Y$_p42ZWr0Z9;EkWBrSnvWabjAoMYy~ zVj7mmtWx}aaE!!+C;0~R58>ADz}CTltX2|3}DBHFq*IxA{*|<-a0^+R9g? zF8b$&NeXL6pj*%ga{f*Zo$otQ+RD!bg^j}=$oNx$ zLMOgWH#W`?%HSY`NFLT#ACw3x7K$0HDyQ(Lpz)*qeLm)bvLP|2o-vDIehNVhq6%Zi zaf9p64DmMlJ#`wxf;zwl>cn*U2B7WKBzDTQz$fIVnIsv6k9m_x$fg!0X|2D7RFkm8 zkg~VfgoVQetw%+^2_^evc73=$OOYm^eU4tJQCd}6ak?q#Yd5W|=+^%^f?TYu0LFko zb#*qVz(Paiax7!ymaN|}B>jdHJIYd(1bXGFe5f2f@((5)uDkSrHmiHV}F zenHGBeYm7`rRqq8nP@+j#nI|d4*mqN2Qn(SCNocjwV~F$Ck}8%=GdjUG!Rk>7xOcB zPf4qJrKPl)^KU{sXhO)DDw7~!E%e34-~KQa%Tv8 z1Cps(>V-_cJeZNNi0W6QN^4`|%L=SuSLz6aU}CvCY+DMl&D|;qtF~TUu8qoZLLEVD zwls7Z%4E;%#bD8%c^rWT+htxaO>J7Ct!#-3H%09XthU(a1G}O?rC6!SR6Lb{x$0yH zS8V-+MgH@45ET9dtp5mfu;0}13v@4jQrWC&aCq6xU#D>R8NTw9#Bzm>#}R|9NFq3< zCFn2{mwZN*PV(J!rwpcDWGH`L!6`KGbji_b>z%-`9FHh3k}WQL26tqfcxBEbxrT8f z_`;$OVixgMcOR~EKw~tRg3Y8`*AM}g`Y#@Rh>4*&WUSsoN{K5!km$+w_ZZq%lY=}F znWcqfrVII7hF0{m8z>ctsD{fHr-6(^bx+{rPSsU|m%P^g6SnTK>3}hzM61Q}eU&0F zHSKIgZireB9QM|3+c%$n6mj=J{k}WPuNPOqT!f$D@H?BRGZlUI906BpG%stDCE@0- z=~bgmb-TdOo#-5DW;{P7>E-lFy4sEy9fmbBXCI7vCkX2*2+Own5zCvlht#5M8^jHu zgDVtd^LTlV&w|@G=!qZjE&*nRkTBE zVJpbtfK?!BlUvS6A9Qndc_qgN=7WUtnzxCN3Hd>$TWJ5Tqa;PTUE-U*oy_17#qLJiS;7}ts<3WN7 zlt^L6z8pwdVcg8C|GTT6jL-14!r?*Y3Z~Ty!^JQlMtWS}N zqGKQ)&7>gzTTx2B(g?0Xt>DgZ)s=gd@I~)Y3o33O$<1X!*+am5_&R^X`Jydto1~8E z2$%855%n{aWFvhy9b;I5m+opig{)SIE4(R%Do@R;4}cGJi7aFJ`8k>CP6pQ7;dtA9 zIJ8^G;VV^e^h`boA`(+<#QAFy>sU_O(D*zyEX>Ktnl!Wb;hdh+lKqbNbU^3lY)06s zvPSMXbC_z0cl94j2mS%4!&+bbSm)m+SpIjs0{-cf|L^?xKQFs~p8m^K_vIDv4>|tK zs8FlPVF~V4Z))mr;bkn;20sblz92&Yw)?3q;G@rhuEy z(H{lr!(w`q2YANXVaJWs6Tm&3Z=Qd+*t*)P{(gU7`?3@j&LGg={gf% z?|v0b9+)8T`lCr1MtP{@HJlBx$%r9RD*L2Zxu#`x#!_V+dQK=f>vFoTbNM&s+nSNs zxO(pmufg#C2URCW3;!35uvk;3^Sy)l8yMh(9qe7=9&meBq&- zoN434J$Ho_8P&PR-bfp*5;`ohSR0IQ`f6AAT8xY^ftb01x~>D8*J$m5BHx6QL|AR) zAzhTSYZx>a?k6P&z-%B*x8OPlrO$|$bIf+vsLjy*zT_}6WzA(fxTwlr zxjVdxO4OEWJ(PW`BdP?TUZ3X`=(6LS3m+RuwSDv-h+=@cq52{E&n_zMfg-?C6tFYf zgcY`*?yt5Iy0zobp#pInRRSrTWe`)<1-tV!_}IZ{@2*3^xEv=?l-EUQzXUWOJID*# zvhZx#=XhwH0H*B|1y^dflNBSwjbj8qs-K(WmZ`XQEG|6$1%8a`9X-PbLv{WlHkx!`Gf>=z43;Ni+cPh*bQ&B0|%JB@$MfIWb6! zRqu{*H`%b02NkB(fkgZffpC@Nxh$b;b_n8(3mjDmfgi%U`yF0t9N&4ws3dKR=$uF! zLwH&d5CnZ!F4?2v2tLs@{#0!nOS>6vEL zpe}liIr7E~`}WNT*#NtVkfqoU5zobCkjZxQZ~G-*rw_;#vbC?~k0wwRNCQor(Q$SG z!yyfpRYpc>WlFoG>UE&*jlWlMqcUdX-SkO6B5K&Mib2M_OLjR@^UwfZ!7_{TExsHfrFb?kwL$tXq^fxg?ORSRpIdueV1X10&wnpEQc`QJW81s!m+5A zI_g$0nV6K^ZtL3k%g&zdV}J!cLf;?J+W_LzDH=w=lCMq%ZXP`2bh=pD5{WE)KK`nC zmcVh(x{`W4zZ<)>C01@>adUV_h2$s79`sZ|4 zkW*75es=UEA0PQHkgs!rG-%g88remOv{xb3&s#5K<>~yo}{J&R)|8kHvG@!kd4iY}I+DRRc z1Ox;SZ6M$n3>YDHa<~zH2|%!O{~$*HS?>_H-o0%^IxZEUCp_>7y#?n*h`RggD}}Ex z)2O0h>Dp$wc5Y+2VbiwOTG6^u*|v6};nC@7YjUxkLLB!~mEsXjNwCpoYSz#Kg(4hhN>QHI;SRnti`c5G$0=uL31iOWQaHwh?LO zvF{p#JHB^;2sM-AwtTT}gu??A*7VuaLOJ$g)?lROaG>djiOLt*nA|ByPJ$g z=?(>w^b9{USR;hNhq`HBE5AN1>0#Mis2uwck?En+hQnXg1*Fr9xL1}RcIlBuy-y!Y z@G3CD&y+OnEYpZXOu=$7PGQv!?B$6bEV|r9+`Y#}OkZBFw041qj~BBViRL~u$JVUr zd4DiS(g>*WqC}iE$lE0>Eoc3xItW|}7y{b+?R#T)=n)LTo@;)ta0(P-!S1kF+@hQ& zJ|$zzl1uT5sxe@jEcpD!FAuZHJ3ZT`;TVe`S^KGfexi?5q(Z@e;^=|CX#y>|F@VjU z)IqZX$T2C7h)`obX@jI4`=);_H*)H0s*oWOW8mFen}ZmMv69c75o3rYCH7tt*A!4C z{u`BGiI)@bEZjx94Ogb~8_PBWq)y#u4PSra0OS?`k3JW~1$w`pa5s{-DSJcfrEL?t*|) zedIA%uh4MtGYHoTP-gx2l#omh=U@=&04FdAM@4;o0@XG}G&XprKcLtdRzY%HO1Xsf zSnZl`7R^M%V5_63HBtF$r~t8)OA3)6Eq*b^-2wLRz|5U*rgbClG&O}iE;4Y=Wpuht z`qCA}d;=Rry+togO3VTNI-iM@lkBY0=rcz!t}0)Fy1We|f6BbM<|pNFqUi-(mW}#j zA51}YQu{Dni#wHlQR%=H=!Nj%dR9=+OrI85YrJ!!Txitx6a{m1E)mw)SU^`)N;0HV zDKsun`?eFkN8#>!7w5KX2~?dau)(Q^(X05%K{XdlCc^OGF^@3Q@Rds7%@b6UR)Y@7 zF6IREC#pLpuK@3q$g*K2(H1kQ-lck^ho^Ve82S5wQVHk}~ zZednfrl{_j@1am7IkP%wmb07kp2=e2NzPO;Q9_WmSkn(p6h#`=o<&S@X5EUUv0)#+ z6z7$w6T<_&9GuNcmWo&$d}ijJgs?6#*Psd$Shmg{gU}FhsLvj&Z`@uS6wihWl~6Mp z^SSl5m8`MdLcexT8!U@h>Oa1%DQ}9UpnalTD9(a-Z+A$BJtRq2>b~uNF463u2?qz7 z#`dIea7|5%yB9|H#XIzNyQ7>KA4D={b}J$>+Wis%uXG}W(FN9kaDh6Jzt0~P@y5@X zJ7pa}@n-&IWl_rsTBVG@I=l74SEYj}UgSjo8Pr98L*=Hz#o zbH8wQpJwkL(PS5n{*Jk2%IyquR(fXf)Y-lhv5t7QfKxuqcGZY9@kF{c#j-c|P2Ush zfvbZ}8H4Pa29noHbI?YMNa_lQ_T7M173u2P?KcM5ez)t2iH4?U^W2kN+ESZv4T#R* z)~+Yw2iR}2Jq<0g<1as2Eh}Yb`eGMMU8LXLO`nX>JMo|RJHbx~`bOM5;2)tls@CTE zDdmj}>6N8kc@bILAZR`jS)SF`D*Z6GIq{{<36KW4L0;HAZ*>#A5BUXgNk0ap|*xjJS;1S{SbYa@oN= zFlLQGLpQBof!Mt-FsoHB5%9DT-mq8w(nbMI9xd5fY)VUqwVm`2_5_(O{CB8$e3@DK z#QR*o*F~e_O9o|CY@+eI`#@41jzFPQ7h-mWBKBU5$-h;)-GZE z=B4@{#UpB=>Ln>#FSrI;p3aVL<#<=gt8vC4S|%TFV4-nZg&53=Y6hsL2#rD&T`Oo1 z*Mk@fP&tjdj`>e+eP9-+pFS>}$-_?HC+ziMCl>fl2Avp2BU1dMs8Bucrw3#t5R1WhMS2$Bv0b!GpZ!$(iNOYarpU|N;Cu@X-N0o1Q)Kej5%D(0nBB*GjSy<=_rn7 z6v3^+G9An&{6!B`#Rt!0$PM1~XXgV~*;z+-Q~bBD4KiKef%+vVh^R9XM6@3FZ0RvD zazGEQWKsw?*gQU>d`txBGGc0YO0jak=U1#=P!KNlU0Y|h@8C!XrioH#LcZxDXmwL| zhevlSx#wCN7RV;JDT{L?T5vO9KWfd9@OX1zuO)_oORmCh~dd~nDysu`wXd5_d{M2f!44vZ&JvZ^8Z`2|um^j8{hu%TH} zs&h7wN7F1pq7`-AiPe~S6EO8Ke5`-Wyd@1t=HZVaSS>-k!f_?U1v6ARwW#A3@>5_U*t3$O~wrkf}9<7~WWW`oFvu0_JGu1I{hxuUl z>9L+2y_Nj)h;(f=%|4vh$1=8|X=QOUiYxb>tEFpcwk!PAb?xO*?d8$olNY+j#(N|;#FIP3m=DND3HBE5Bi^v04MjrsW7?5- zJJ+Au7xwN`cCYE0BkVz{t@gxzHcheah?9Nni=audC2)Ar+b~VLA=}cA`d;2y$=*fK zD`9)+n~~c*Bxl4T&CxrTL{C0w7VAUTeJ~P>p?OcDxN^0WL*#}s<0`YJXlTf2aV-bq?jP5K~bs=y%(F%;jA<$*nTp+bXq0Pbr%A4`BpUlj~vY<{MAOKk-^nDExHW zptTUZ{;KRJ7dupeWnun^IPSTGXob%ToxFq;h{a7OY&4({jF)kP=BrXti=9Fq=w>56 z;k+kmVq_FZu^}N7fNhG!A}G?tKp{xd90{L>Xo|(l!ER#Y6v$hb;19TgsSK2_RKn+c zcQ_ykQ~sS{DIXA~bHF22l=OT_5DzkoG#rx|ptu?>KdUI055g|$fmxUDpG=3-Yfu7h zSzubD;{lr_F_ow6fuMgv@;5zzMr6 zsZ+u*pKX{XBfDfajakwo{7_ss54xaAvEmMNwic|diiDtd(3+s8( zWiWY-qFW z5&^<92B!$5Ugyi`?wrKCOuE5BMp26d2yvjC#JM$c!9v)mz~vzqf4;H$ zp_tI;%g~!HrqRzz^3S&1x68Auw#=9s4 z(H9d$1Dg_;b&nt4Y)-s)SlY=rIr`{!YiZ;`rH{J&tQ$rehmEei;{yHF(`}6jVhG;* z1zLxlIC7!Q8cPPWSYwj0MvQz&#qOuu>wi*qRm)+dD0NGeo~G^g3WarH#O!`)eU(~b zH+0L#c%ouqf?A*M`~z+e5euGfeoaoOZaQgt68|%@d??R2u{T%rOHm zX6n-+7iLa{1fYNBG`I+Gcq3}`1)P@j5ZA{o)oJ!lRIWEWK;bdh+xOT@O#;MtK>JN>01G3|qTcSZpeLfcldzl~Sd|SzzJrMCdG4yz38`W+lG(HP%4lqomSiQ z^rJ`K{Y#q})mz@d?-W_`?nZihB3_6(_deI@TqV+32DYcQfC?NE6}|`wG73)#G{KyQ zjuu?mW*zzM67S-Y!wyu3JD1pRPS-XjF=1SwNyg-0K z#dL@tboM@+^rvQ2WfC1;5M(3WmsuLjZ@DFXn5++w{yi7f&S5`iz3Irb5sTiFK*hHZJdl7qNhM zYo1LO*^1|m{n|b)U13;&f==Qj^n;NTh1kStsWKnqU3@hQ-9^brw3E~x+@Xwvk2|5- zd*iMiX63o;qlu0!ty2IzP7FB5mm}DUyfUAF?5<=nJVh)#DGT$gUKxexxY&an1C*ZH zqd;;`=OsGS>8nw_w+wrl%RNh<@@l-Ec>9KIGqvY}*@Ut_x$Q#Q zbmZvCpBTZhK6%g>yGH5K2D(nW?}E^@u)cUTN}?`9ZES|ogj?P%VROcwETkFj+?>32 zzntBa)_jF@e$Z~?7!*gL1oHC^bwguM8y?Z+|&cFIw6MLKnl8Mz#WCs;Z9h_|sAp1ocT zY7>*NF~8m>dggN^dZ|xv{YT82xPr(Xp^AuBxm6T7;-KveA?s5T8xi*wJySd*vyFx< zRE`d-6y>1AfQ{|2f}^~>b|IDbhS;3`&7b`+lKTN1&9d?JQX9iCgTwL|voITB3{HWt zG{oFv+Yo`KEKb|;;4(j1o@OpYKr)L6A8WUE4}?p92{(Zk6)Z5hsc78OvsVarj87-A zU&twD(9Vg_Nd-N~wd01DS2e)ahe1dmK~1Ul8!bKn@VX;{blSIjK(+E8=C6u(5qoHr z&1$QH5M{ecdpyLOb@FrI=vZeQeL|OMP3nyKXVlV<=^^k1HF?lWSC9`3d;;e?rv=<} z9g&27oZNeyOask$HX+uCcGt!nCz#!pNfjBSzJWDBWEug;&w{raLbLp;T9Ips4W zWY?u4%*Cv*qT|G68n@TK!|+sl$0f&}d)Ap$*|OrMAuZMl z3^FNqQpOcKWhvFC?Z9o>^uN1eaDF@+m%1(adm^4d@+!A!$l!FUYk6=`tVqwX(@rZ; zEYxS>T0DHF(%ZiOX^Zoi+*TPN#-2p5XkYheB_O2?L~glJ+VtTZV4j+CP)yq5>V424 zP_E6J-VGuc2XfOTf#%#2hodmj*c`k2+Gxnhyi8dCN?W&ZvW)YDzMHl({{}njnjJ?h zN!%j61>^KWbmm6uu*1+wn8wc26~z>7|6sUgyaFr0pHQ`})ET7t3`Uk<3nX)YZDg9< z;nv$SQuq-D-^)c&ND=5SW4n)(e*T6$vkBAww|ia3DLNw8D;V{_lgnbM@!dv=?!`VZ zcVtbu-9Qk#8$Sa%%l%|bx)nSvWI{2jvcg#l>+%hLm1te7539_MulJ|6fda=ifW7Gj z3+Fvd_nOToz^(g4^#x2xT`MMRt=kENcWC@i8Qb>DkBPJ^1gs|2oDt3LhNvdiD;bbO zzwgd4Z#sWL0xLcm7GGm1?Uv051Heb&%v5}cGkpZ)o-sB?>Cjbt2J&yP00*w+(~qyC zc&w}F$Q~(2)<(2|xliO-Ig(s$FkE~PegN|xk5P@-aGU*-$$;;VlLl?=D5tdw++4oC z$|7KHO9|!kSwU`SdD;m#e^HW6h11KiOYCIs`N|X9Kj^kePt*R7!*UDcze6|X|0236 z80#AuJ4o9a{p&qoa-%z6xb6nPzoUqX2Alql-`ix?;~zx0jq!ZExZv<~vAx+lO1k_O1T^~-vGc7` zUx+{0Z|0i-I#ShHFB7c}+nbq!9n-HhO`rO(JV?+uz{h@H!M+z^iX8nwHt|!b4vRGy zi?Mn;x8-R9R2BWt3rC)*u}2B_N&5K4<_cpr>&%M7+q6}W5+e)Av@pQK`=Vb&W zn7a*UUH`T=%l(g@8f5!>I@uyTVkSUev@GoL+Vn(eu@y1md$g1LqWo+;D>bh!jfuOv z_*AM>E_*X{86Z^5LwakPMX?D=V~`e0MW4{aq0p{1es03J!wTX@l5pc4AzCLNy4Xs- zJ_ajH-h1*7g_2{&f;Cx~*v%LQs6-ppu^$Y(Zf~GAQwtu{!nyMYf8@n^n_3c%+>eeC z2BZ$9lKf!F%?qQ*%$39A$doyRjlmfUEI5Xa06BEccs%4W%IOG?wSogU{TN`fL6x~^ zbCfUidATs>l&RCb(~6X6^$ISLM}JMZ%T5w<549FGG9fNiXDA5;g9j**jgMc05sw=W z$76*pGze!}VQJX&^WDmQcwwLW?b#0Lc@7$I*i;#UE4!3X@Cs#Fg|^zTFX3^%nOUPy z_2$z2ax5}qTH$5>%Ba^nCO!L6u?uPC@9k#_H|tqj>?=e3oKJ?l6<%laM$RoGf=@lf z+t&uJ-tP%Jkd@b=5#H-=0PkbL-T~UHEv7^z+z;03x)Xly6;SK^2Z4|-U-~H@%`9Gr zQ_XrGDFh9N$AAo3ym{Y9o3tJx*Tx&O!fyrZ_1nP)a8_p_;m~;p-2mM#Zb;j{XPNcQ zHhb8XKvI-nXUX@cHauVDb}4kN*z_*O3zR#_IzC04*}Csmjgq=cdG;e#3Sy0s%D(ka zCN4cqaPO*nJrshH5S!DZ&RKp1vPFW_lH@Y*iRMT}_^vaP^eET2AOCz_1ixI|?!J`i zcVDW;|NE@zzp70CXJ9Gp=H#Gn=w$0a%x`03>!j~wZfo;@dM0ISYw2wFFBGFe#ZpmG z6y1k46x)Fv_)UUN2jX5${Fh+2hra?aTq9R4TYlAIgIJRrb8;lz(Ll26LGm+-iC!t? z8vG9Ko^|e|EiHyQN#B65E`u2m0!-gx3r)3a<(XDmQ^ldDfM6cm79aVx?Sxoy-cs_zoQ=`>Il9qy}Ru|{m zcyeQ4*7(H}q2}n3Yi#fX&5(@4nu}Lu|8r?F(8Uxfv?Yb3c43e2tAQlZhxxU^;j>-f zH>J1UV7)_&+IfF;xL-g2YA zB1f)?`VE>pl)M=0BzAK> zbTSOEug&0KW17_UEYEMC_5{=s0l`igyQ0NK?RMDvf^sGn$-zU1WuKO9%=vG8HG z6pR~}b@`95WL>LM`np}+thOOLiySWIH!zQaZUthVKfr_vuS(vGV5GJQ1rOhmp_NU} zJIhV7!m(MJEzg%r87fK)99yI{W$XP|_R%LB_(x+rj_5HGTVpX>N1T6?I<170q(pqG zDsc!hO^CH)7##1lq+flt@m}_c`{*_-=C2#wG;n@C*Ut_>88)vHtnKJphUvd-)G551 z7M5q)nsQmwYqAW!GzoL(5lmg30gvXFrMW7f^FkF$A2T@x0(ZuNKko>!vX8KwSp&@S zO{C!3_*bGA#Lklzc?miGMCZw`G>XHH z;)1-tnsf?ztv3}`&ZWDW-?B9HsQG!DY2~q`Ya@CB`rqM^>VNUN|1aQ? zgM+^N{}GBNR5ia$GLS!H5E)wl==|pcl!h=g0KH~4l$_<^0gYU8IqKzbvXSrLeE>@n z18Ln?@E7nGtkzakYK!wzLpt6DS?w~u!m`(N$e(7YBIAO1?50zjrdypIQ-}M{e0(1O zJ$RWP6jJ@>DN@_)g~Tj0Nm!V?Quvs5Hl)`GCWyxZGJWUl=ePFhLjpg`T01P;JqA!_>(gcVGx z%aXEbN~1j#6Jb1FOY=K@XYGP?<;@nl-J!q(wWN z%^cX4_*ThCglG_CwCLO1ziUqix7@_YNA}2t19H6`p$gUlC>Y{%h)DSiPp_3of)6?UX4aQ&=CH6I^&tD->4o+<;nOQU^r$%4w+>D?fN)fy#wHTk50Rj z1M#OUnU4G30vI(GqwND^&`lGOA7<2Q!p|jAE1pFi`;Gq+W%F=CcT-g$;^edw7!pq} z?2*S(=kHR8K6QgOW!`s2mYXN2&ec!Q&q0uKd@Bnxl36@0b_0h>&UDc_knIzM%8gP< zNaI77!K73w!-SAf9A(&u=3(Y8*yfONl% zNxpL-;u*fPO4Ufv_YB6Uhwf$0j!~GZ@FR#R*o9kg?c=l2>C+upxINM#NLsvPHpK|z zu0swnB?%V|n7)5$RVT_VBH+5Wka2Y>3{?%=xk0En=VpPJ+es2Nek>3uc45htf!e|j z^Fa#w>+7lkBKUYmAZizd+d9M_4Iy+KT}Z|gvv%-JnM+zSHiLvSU{Xn9QazXGPS`Ms znAF=ll-~Z2Or0wv%-EU}`Lnfi5#vE&chYrSB$uo-jZ-aCpSY5djPcS%x zm+Y3@qIe_Y-N-M%@5m(DjKU+^0%5T`fuWL)Kz7Cu@cLl$r3vZ&mrO$3UY-+%a&FT6 z%xm!2!K~46g!GO3T*DA6CSjO8!VDkT8Lo86e#l?VQtedeC54><$((bNI)Z%o{F?h1 zv645ANH3%sp%y@b8tZzVff{-X`k(yopmR@}peW5}Fn$ug@VFJN>ZEcIjQ!)AogdcK zsgcF=44sNEX#PxX;sf+5fwV!7Wzz%nmDzFgEMD1^DawnLd(Hy2SnnD|q!+7FN^rGsGNWVEs|5Jah zuRn-y`&H|B!~8q&ll=b$e*eO~2GrhvD=uJsX0m>nzf4Z+sVg^9)g#UZsOeLp`XYvj zNI+XtIN2CBjS&2_xtOrAL6>J6LUvB8I%Z8-bDE4C*$m*PTIASxeHi=5^L|K=TU%r9 zh-Z$U@-e$~%ygW*^~y?e%skrP`h34K{MPY=*7v99eBWr`Fz&#rF_t>DFcZ5B`PqlC z)#Wx%L%pf(r{Q+IwK>LGed`NMUp)(#Eheq(cf)0R-Ff>735x;&2b*WN&iJHoO$?h9 z<=T^G7X?GLt#7cP)&N)PTDcx5umSan={BP^?EU<7~V1~I_KRkt> zDQ`s2D>1-hf_{A~WSal{I!y24uplCV4oVN|BKwbr6g~HP{xD{6L<$*u$rE;8g|k#p z$HYscWwiNut~UkK7`T(pcJGEOLp|L-6SkHJjdt+OLrp#Kpa|KC;pe)(|DfBm#FYi@ zPiZkbD3HyIFgX^NXev#j3h4gprJQ16AAacJ5elz z7=+M*HUF+9u4>fQ2z}rc-89QmAAet5@f{NKfS}#)GaR=qN%auE|cfi z5C@gWlszVM+s==NZS|n^2po?%0$oj(qWeo+H^G}o=X}p-Wg|A)UQ66)JBH=%$O7QQW1qAm@X&@?!{kM@FF}Y7Nf&ySH%+&M^EpF={GmiJr+Lgt$*$z zypP`ain9v52WmDV#a05_WvMpxX5WX1PEMJvz9b>6R+)Q?6Wl^XgD? zL?3ZZwz6P%$fJIC1M~9Gq*bk_z<2tt;T4u?jLrxEdePa%9rszt(Ok1G6VT!gL1fXl z5j5UDZI6!f=;ht1G>r2jPHel>j4L7>f8b?eQ8;X(Q&D@&BW;K^WpWUOAfw~*%tZS8 z8JWGssN`UDaWD4$SEs@>$5gpj5Yqzkx(y|84#?J=k16a_R2 ziULRBGb=`YqI8_Yac!#*#_m5ruj(c1&RMc*85BJAAbo9*&`Qs>cy2Ghve3Q^M z#`6HtB0Pla>33f~Pi6e;!F9W%WPRut*zGR4a;L8V43WXxXF@QET1XdQbP}MI|+_3ScQI}UCLFqM)z|jTvriJ?mp@X zGGK=QZispSrc;~}^6rQ2ukqL{f_TBMp;xMz&~O0WhS2XV^2wmsTR46pyOfKfyXj-K zPdSS}`l@sHo(~klw5h#L-`=185Oaa^Qc-=&SkE>Onc!?X`FMw5+I@K;>R@h=3QCgD zPHWl}3_LtJaQM4>-8t!Bae&N!9lE72q&5v z&*7X~{Nj6x2ugjA?3Qv(CPsN$2w5S+{7KrNZ@9v+?s1pdTFxm%8R%QWpk^r+y`TIq z1p)fFd34yY1)<12`g62+xy!z-5Lk|~LHm%y4;d%u2MKm0*mNd22zYn|yH>JYOVC6* z*B72|JiadX;*e&Z&f(DHyFbF3{}4VwMTz}FP^c2e6DDT<4a3avsGM3R@R}RID#i38 z^~B9Zy8H-=u||@eH4>@j2?g08l!~5il;(#{@Ky8+;O!J6VBWMw!W$On^cK;goU%8t zbuh41B&bYS;fD&9efU#q-kV@~443F`R<08)*KSreGjdzRkCqZszmRcbFCKb& zny`?f-jS<9igXURK#{3BbFWKE9h(97u=-`x&u>-YgV+~s6fD`D--Nw^c3lB&3rRJ? z-k{z>mrAXi@II%;XOjV)VZfqTXbRd^DLpGe{e>CI7zVs$UN|bE>J(pnYM*Zm;ZuO z5D2k?(-o9W&U8KeJ;qB=sD|(sgtzKklmFpTePA&vWphTS>#QqH#XGk=rT5ZI*gbJk z8aXgSe%JOcG?6`wT}T(1Bsmx4xW9wBOV}+SqB&ZtI$_ZJu4w`-8#)(`OU#F_Vy&SL z=`-H!{qsLo-2bvIw!(cm!0=%GJ3=Dz|3pYc%#E##{#Rq@U${tv>d8OF*C!7|K))J7 zlY;q#o*XJe?jk6475ur%y^Uh0`tw#@;*Mf5d^D&O|#}AHo z5D$;7w3rxr3o%Uxlf%x}i?-LBr`yXdAMj~kO8_{)CYX$gHA`w}FU4+_`Toj`bR-x8 z;{KX~rDBc1_qfYQ(_);pV*1bEy_?MmsG%A4zJp9duZ0CCHN{YUJn0D~M&eZ6riV;N zHlr2wS4i0c;LMi)SQy5iO>&~T4LLmb^dREb!?n`*Y;28`tgaY@bX?0aOXq)5b$SxXr*X@9K7<vz@q-n}AmQ{s znfneCb52DU%)=zKm5{B}R3nAl`o9>%j4)tV{je9L0n)}!GCa}@Qm|nT6~`hP)grZ# zMZ1nkpQz&OG#>=6G)3Ge9=_kUK^h888N8&f7f2(63LZqhj-&KmNv6_l~c0 zyVB+bSaV89V;L@lxKQ#b4;^IjTK+#c`=;Q^8g<)_ZM$RJwzFc}ww;b`+qRu_td4El z=omNuzE5|bI{ThFRr6&&%vH4>K8{3%xDmSPZ=0wvaXMN6z?_=f_j{otPzZy!nF|uP3 z0~ymTt+J#4gVr2PUhjtuJPYD)bO^3LbxZ_l1D0nrhjAEB%*t%s7X`k! zefmGNkkBDw6sX4tPU>k`iTh879QZ@PbRb$_Iuzz4K!c^6Pw8l}D^c@RFa{5BY0IEO zm?z`Q-kOr%Ro<#1x5+ha9m%FSxl20H;SPf@LSIl@+mH&6cy~uAar4?p+IS5$TORO5 zj|sETxy>+NGjtRSNEV%nuY!dC7UCzu;@n*jbxfgD@CkJ!!Wi*z_wB=;N0{KtSarx0 zQ1T;V8bf9?JQtJ1uJYic;*pzAYN4@2?<7GAo7I71FNS3lX_J&((v>uQvl2;N!0hom z5ZNYY1SmbFg_ID_TSBv;ox}G6tH6@@l?;fz(U5YB{p8FgedN{3(%&ACG!acxK zeaZ$3Vb|?e5o{F~I&aztqTBj!d^j(QiimAfBj#i~;I^vPMp@*#b z&89hjGFk1muoSTl)`$Ok*>BtLBUy>1j0~Y~XSEL7?JM>~bIpBGzA%g_--0eG$5< zR~Xg<-rs2h<+pzu-Rl}VdS1ctKmF}-NNMXLa+00O2<*1!Jn@7Z!(3E#g!gfupK+0m zH&;8H*!4%9*l$MRip(5NV>wx(P+qoPD>zxCPPp)`a)(eF-CswtsIQQZC>5TQ1woUI zAgP5{YGC)Zt!kv);<du;5?b_;`Cunw5bT3r;e22 zrT(S`1$m-@_6D1)E>R|sKCXeC>)l-8W&|bqdU~F6ipYsP>zOk|BKQuOp>d?kQT5*Z za>Uk3YD2}hPcsQt+tKor)5j8B7jNQQdotwgR+~|hmcy%7iyxta)C6odH|eV3$V!#JLj1EpfgaDAE&0A`#X$Z~B~tuAn(!hk)(ax;7(j!og|?F;+O7O z<$T(>?>Nr#x@sRN9D&CJmmfI8IwP*oU0kcItiIK+YpvkMhEuaSxl~<7+R@5yp}wuV z+7AoC>nLeDRhVqmT;whkw7LK{N=v3O?JQ8CtgoR8bT*zpfuRXV4bjJ6IrEkx|tHL%ZIfQ_81uaj)=N+nh+t7oHK zm;|^O0S_35LWMYuP|O{L!Oco5E5?t+Wd<0l^Qqp7xy#HZVhyh&!k)|dt8a6ODs?F9 zEXvRZ!=fZQz%HIrG^C|a;@P4yOSr-cPePG5;EH<`Cq zoOatPGs`$+NzDrrpUts|T1&DY&C}HzVIGwbdvsTTs@S-&ND!ejxg#4%<<^)pEZ{3P zV}e+byyQb({tiRd750iJ>UaooKG=f(Y~?PG|CzZamp&Ztg_+OAU*$?+(>+Ez+SSyw>f!ESjbOpp zEoq@Lki-O-@@YyV+oR-NkeVNEHD+-OSu4k)gccP`iw_7{ii9Z@LGSo(fw6`-k&CXA&4KeW5#FyfF<9thyCn;KHyts???{z5ZXW$y%m7(0G z*!6MugJ-IX-gQ0}wz6T*w(C1IAVp`M0LASu^n{-^;G&Gbs!UQRw-IKiIN5&>*}+HH zYm@0`qB(}`M#hFc0YRQ(%|nnfXUU@`%`y`pNU-k#@=1eV4uYN)zp*(S7U%h(;sqcK%5T8}F0xdpVk2<&U1Wf1GAYdJ!jO#eL;OC^3i)GPT~3eg_7NFJ;r|ljUJl zx}HrsNqiw&N{j^wss0>RpwTKl$%a4ev>@qSbuDwCt;M^2oEoZCTUP-@e|tmpT=dzT z6ls%*vx~D5Pg4~3M%3P>ub1=8Mj0e(1c^-3fBV_&oiD6%i9EYUTFIO)M9FU)_E~!e zI?||=nn%bCx#2|g4%Io*L}asW@B0%xF;!s(N{IVI@WjoEt7N4JU3#V>%ew6Rs*ee5 z+7B-=D63^KL%?bbOuA`d=J*p^X3spN*^If-mb*}-*-e8F9Vztp7X-o{Q^+cY*aF_B zWo8ZdgnO?>37m7A>C23wDKv&LyjfOu<%)JQjX0M(iY|8HUK^??Nl1w7p3 zo6xKqaoAPQg|s5+3_lK-*-uRV-6sBGWoIUF_qStw++q32qf}6ES+ic;_EP22tZ^=)B zYj~%*KJOTadq^9u^@vNGeaDI%)CC#8eX=S0_}PT-<0L~6&)}mq*o<qDGy-9{hja@mQD!DWmJLAzaZ zc*h%p1k{Mx{_=-AIZJ0myYD}Wd#{hQ6>m?-rdWqbEIbfm^AeKZlxDw&Q+VYZP#lP5 zlU^vx=16XARRCJH@Ee_r6uLdbgpvKPCQT++RoL@rB8s#(!+6wb#0mf47&9X$Li;!U zc_)G#uCt&+1HYE=y{4f>Cr#6hyqf>(s zs}?kn@_1ow>C*XRNs(sNS(PaVU{q|ZBxTd^Sy<4Y`x$bl55#{z#qT?ja12z71 zKvomJVMMz!c)ujhm~Sr5nzP<6#l%?b%hKO!o>l-DBiWe$jbhL>xAfhh_JG}2REk!5 z?4cF$G;c}K{HEfeFmY-F)Q8mAcB>gWIYfzhwdYbN;$EY*A|lV>!9hg z1L)+x!hjF%xw!@GI_e{z6z>78E)1?@eHtQOEx%{GeK2Ecj)J%&cVMgX90F~+5{8f0 zhAYiC(uDkU$DiL(Jv;KW_E}kUtupn*_hGE>&n;xwwSeZK5)7@t?Z5}$4DSJ*$!wK< zovX5$sUy9KGwMWgHhroEMDR-z#OwxkaLNyYP#cktKtaHyK5ZoOtD!Xl^_2*-0uH7G zba1FFWaKGAn0Cy1qUCI3FMBY(>y0HYVCA=y0X=C&6=JW54|7}4#R1^5D z%x{bT`}nQy3BTv3s&wyhyzq_>a{5;3PmkPTl51v)2fj$;Yp1ww@tr5W*q1E~`C}iX z=&jVczBi^8PrW|Z>&h@My#c!G^R}%waNFCSF?Y=>rj%IvJ#+zq4S|rBh84vCas|MH`!ox_R16`|j*;0a+; zhw+!)eS41JD2sSnHpt0wn!eDePtcYLv_`goU+9cl`bjYQ*CJVO>?OhAZi*m}1k#u7 z=hNG5n7t4`{^iIt_{|DPV3|1~crk|)A}cW0FFiH*9XF8YeP3z}w){B9U0U}p@%n)` zwxLH%+c^Ks1K16k&N{WJLA(YWw=qr*66rR*oUqUX9v-seeTViRa-+cyg2UXCo?Mp|s z(7UzAD4%!86!jhlki(!ObyHj`nY=# zKr1@blDS&*ZPPoFYTs$gBv&fXO*d*F*3m%9&p{&~u^9KAyAL$wVc^$aTZX7|n|Yq% zyF(KFwe{@oi1w{%rS*$Z|KwLp?UkoM!0e|vWPL6z?-Ju65*FBqatQjs__WEG6=L?T zSx|QTVfVy*A!xhvW5OMDRas0!%rJE07a78 zdVsERy3#*Siq^1c1C!Du6I0GK01uiA4-SR{5l?@sNKt?A5jbC%$z297>Wa2O!RKX_ z;=v5;=%IdfW88s_nqI7A!?2NQqJb$g+f*}sNEU1PpC0 zs5ke`&BjQD$63-%)b6{-D)-ax%QcAQHs6-tD?IFqs+0Kok%|Lqqs#*EhV9;zEu+{4 zpd*KEldt&mudu`C^Db#3Di%DGhw^MkKU4E0K@aCUe{Ct9=!ncHd&(8QoIcPMKf#W- z!v>hnaYqiDXdoL0m?H6H=FOj6l9y#|p^31Eo*W@-i#oG{P7=EVbx-F#5qVDWl%{15 zR0q8I{WGw|crK1Ji$mv2hof{R5w7j-kyXmiG&79ZjW8zwz*G_9coL(WEUw!Ba z2@UcIZ9-Qk-FmORa%1^FUtiRI0NVQO1&&ijaO&IGFP_AC1P379hlvFFWCT>$`O8B< zRFefBvKnO;&9F=tA)l~HdMDDLu(_722mL{!@(ES8nk+pRW}?WW&9q@G5{Od`CIdR~ z=FhN_4Ya_~Ipu%Xd4LH)Kx5%LScYt-yL0B{#6lXgBfQAanp=ci2`~z`PXY~m(uk_M zoOKwK1LHEwIw?9J46Lz`2+vpC?+IA&q(Pw$lpH1u)sdsXNp^}oC!rIWW(V}<7-Vlk z3G1~8ReHiHA;wgelz4({_ybT=zQ3G4n_w-sQ7B_m(zJnRijpGA+B5!rQ?B^U_(JPM z2?<<P8+-j@u>>wDjG>8N#&7GacWHH zDkaUbitv0+;(E$UqLuY;oRkX_m{sG39^*Edv3Z~FLdXfp@dk0g_3aE3T9NRj6WEf1 zrC)`=G-q8{smICrM&#I@ALQIEAI(P89rIE-m-R!)5{4^lbU+uQrBH12+Bu&M+@)O} zBhV95DiP~cNw~Dk9d~6qP74KP?plNZzHR20SRaGHJ@MF#MTVuw!K{CvEG!fkf-7`~ zuyN=p_}{}bqxOrEVv^)sBx+}xVp>eug$INcdi`?AX4%z2-v(E#oT7v09$T%3Y>Y^P zUGnxZ7lO$vVp-fF-SJ7(?_NH)-ucO^i^QSgfCe)`#%DY>!zl`+Nbw?TQRw8o%*O-^XEe) z!q!{k;#J)UWfe!t1gQZ0ldL$kmZ^DrQtR3rV1Scs)3PEh#={n^0sE%>=OUzZ@_$s;z2vMOQ)UAg78@zyNE&eIJ;9&&o57mXF~RSA2gy$1 z&5OsSpKi%{sb{v9)6uREi8OazP6<3D6+~=b#K8Nk*EGR+n<@Z&-epn>x zk8%S*YN}o5f~Rjh82N@UV9|&THs?&A-K&xkR*N=OnoiDAmQ9}9+dM6}Hm6LxHgF?# zCMQIqKw#AVawtkBb5&(HTQs$$6KyTl&Vwmjxya^DDG*z~y4RxbtVnUQ#D1#L=26Uj zl9kC=+r3D4;=t;SDTR237ygyGSq44Uhwz!lmi1;&P731&@AG(A4uF7i3-75R!gzUD z*H+_?+;nlfkwA@IV*O*Nr?XGfaZYt-I;+JV+Y?TKpE>l?UlEP|LVF1O5SuFbe5GdNH{BtQHep9f8da1b?DwuFTvCD~jhJxPuqG%d(ZiTX zK8qU5Foy|un4>%R!!N-S;^XX|gR7o1B77+zB7l>}A<}-GgjQZw?v#g$3>)X{%8(&~ zTegBg{Jif?{K21xmHeM8cSvqoCQj_L6U!>UO3e&EitaV|U zgyi8E@ty8V3>=Oy&Sb?_bqOdeGM;A#upEn}buRoQOBcTeh)L!ldjCK54 zv7VZYqJ{%v`GhyzP|5^p7JarI#OkCwB?sAa{G>ChKVEo->vdCL8wW<)`E6BzlA<77 zRm^{U0KLBxsur;+`et$P?Fa92amst|zhtV_qebdGz5&aR|L9@E{=cbz|F*>Y2cT3Q zarumGnv<%eo&f;@zUYKpMW+rwGywrN3c{~z(OrV}k27*;_98`pB)kTRo98GO#%r}W z;|QPM8KH_td)Bm>Mn#18`ISO7|$W=Fc0-EThzGn#_0 zEvK^5Icqtcrm|L3^?W`>f8bDvtspKYZrz?1@#R2+mv$@FtFLgg@D?L5%&e5lnU~u) zDE#b@CE3^fi51B$7!>lyM7*g@Oe|O4CwcJ4-VQ{Z6M%|bSeX&q7vj*DW%mx=7 z1>KAgs!k;$jsc= z{dp0C6ke7*8ve*X*p**k=t8Lm9f~1@)zuRNJ|Faa{8=ftqE!}--D%{&=%5}M+H}j1 zxHYI17p$F!43kgad?On83Po;9oK)HwB)ps}Ze&I?1POKC#l6n)ZkC6BqMb5uFCj;h zH&)jYm`%M6nO`ekAcQ784-4-aH>K0aa?fH_bhai{cV^FziT?vbtzt(G) zXJubiSh{&laR1lE74K(U?KA7Acp27(=I5Vaf0QY4tYpgX zz3HxDq1m87q#9tt_g0HTptYA0b++fhMC-)kyvcDSeVFjquqUgy$=;3z)39(j-NIuq zAQ{n1m!~55tqGDmBttuvxXBcXvA?9dbyIj<0_Edr9 zP&#Ofl+b2=9p9g`(TQ4a>AILItUt9$^l;%~J^UL@h@^u7c=_fO?TIrBO?hZmp=csV z)Z$1SC|e2JD6ggNfq{x$f;uo~S%B4=DObO1^|xPgeT>ej#KHTZ;)!zdS^Z5g@EgZX7B3itVfc$Nk@fPy~IJu>R$`jvIp7D^8W=}8D})$H)P zSK;Eh*9J)9qDT2j``bd^w*?S`Klp-)!<~Rw^VF{f0br0R3*+{q={d=$oO=GSym+Th zP^%3ea28mFLS=eA=#OVcfOh)_xe=kl#gvkv=u(H1bbT%?C~KQ7Z+7cNihJk?jTZ(h zd2^w=ybO21!#=!q4uf}sv)wsxCPVa|l2MeX4OeZ&Vaf_RGcb%Q&L^%0r_zf$ZDQ|Gdin{pTq zlX(iys&}bz6J3Q^t>o9b%Aoz(>w-D97Zk)q>a&gkiQkC(RGy1U4zd9R+eEDdH{ki# z@vNG-hX+bN;*x&`P51Z`m;swAo0%=}`-&jk2=bThOy4+Qe4_f%$!#Y1rO?P9$JJ%KyW8LqWP3K4L*AAKMF=wfE*7BE{;6P?#yKR)=NE+?fa)dNU z=8L6Q&V%v;sHXr7-KbDg>d)-7pOLrzoEDeD>X|ZIDB(`030dLKE*<5`Fm+An4K0Hf z*D@Dhnml_Mq@^*2N=KG#BzGNTK10+WXnDgkHKw9$8=y7m%lEn6-a@|mm~Bc2bmkHM%X@z@CEUAB-Iwjpc+2i+`yQT5^Q;HH`X%$fwQ?)fQ#cQzbOy zxbW+!1LHUPGV>i?;8>3ZSl+$2_ucnGQ8$>4TJ>^XvT{bdVQmJ7rKqt{Ip#-4w6D~u zfbG`tl?SiyCzgkKd%~U!dtoIbsyY_C8%D^{jR-n?ZrplAwzf}!_rq^ikkHpu=B>4=r#)9XE|EGqli*3%6GCx_R#Z21N#uUI!y*ZZCfO2%OO)~w z!nc{)WyP7yR@_RabooWBM+EHG)C;&TH6f|>p?wof62a(@H=A`1^GAQRhd1V$>Rg~% zl_FteElIl${bq|iu7CHB>ta-dp_MHh7dC0UOM*P5vsMP=b=A)ty%a8|(iyC>7Pd?w zb7rY5p^!m$6YCCFX~0(bK7p)5CKXv+O6- zXXVDT9kr>Dp>KiXoQ zx{{Nnh2&BcQX{!URja2wzMSTCkrqS^7WfHkwy?0gKjY=|xlidZUdqH#r5`JU5?`NR zv6qSKjjWq9?>Fz96rkZ|HqjR30=?1dMqLKgkAKnZWU&ldNX5#KmZn3&@cE?z^bAn3 zOFrn<#390Ry6#L23>M9DoLm<(Rd=u1)Ta3$Fyiu<0E*`9nW_dKmC8lK;oK)eywP_i z%bs-;KFhv4Uypz_Da1_nFwj{Q33bg(8v>!(@V{(xILqr^nIg3bcqH)$TI+SUvI@3d z-BkoKqKWxoeAe2%H0`UpF)`}$7`;LEXltp+_1>e;v(;i7;{Esh#A&0+WTbiz>iC*) z>E3fg62nEs>CPGsi7kf7t9$;lhq1+bKss$es!p>PKk9I)XM$}J!P?b=csI7K&fnyT zbGF)QCwvi}yc%D9T73DRAne^b_(y$utN8~%d|Eyko}SiUA)avzK7sknTMFAkN60bh z4kOOtklpO?H`MVr2+cX$96*h6{-o;>Z*9*t$lS1p4B!7;9MRiH>&$`?}zSsbJ<%>xtjt38Zv(?_S6i8oGc%G02jFU9sDG%l#`T2ukGi zo$#G5q8KR00EDC6=5JNSEiXf0DNm*84U*hBY|i5Xx9Lq)X^%1Zw8xpWnf+4Z9Zybf zA52Ob9EA}heSu7Okknt4G6nwd!?TGtg%4EhMY%%Jk0?}=+CCCmDe7xPua2OgS~N)s zcdh!MAbw5~lCEkIq5fQ{Q^tgdS-hCIDRtLX@^*8$qUjfP5d#S!p$yWzo^bS0eAta`q?0ah=o-?r z)Z=N&lIIA`W&*&wo}_0!EsIQ-mN$}w#qw3hMf2^<`J{X}aUlq~+{s3=r%lLe%qV0w zbOiz|6P!3BOX$Tz(+%6jsjNYyiaxy`{h?n^ex&mY4`UNVDgk@gPv z{iHM*g;VjGXF0{Z^x-E;&N-g+alMcPg`YW`3lmBM+v3k&QdI}noS##7PgP-;@8O^~ zpnlhnS;bn#v-D6SIGk{y9Nq{KH>CYZ9AWR>fxX`!D3_5Hr4@Sxu|^hKQU{&4+YJ#t z*_6521&?&YpyUSbkt(c3>#0h#5JLDsNF=;|PTB~*E0yg(D^79K`ffNn7C7Z4{5&@bpkLak8^^`R7iY6f|Chi|i7`BXCww)VZGEALd@8u&Z|QT5oW~3mWU;D7kH%qa0mmjYVJ2Mi z+{wV72hPpox2fji>*d}LpdIX`h!gQeAtWP9l}33npC9OSnQeyoKSl=0$!gNu`t&8- z5}9GybK0kMM%)fV8nHu#Y@?V__gccJoFB*nIVXEvQ20&jj*Aa=ldi>(Vr4dn_Qi>8 z**C7asd=E^Nzna`+cx8PTr;xM*ioj>IkW_KxUI5jdt@S|LR2};%iYO?P;YfYg3lBL z;X{~PWcy^n@WHqj5EJOhG6DEC?Et+{f+lUhO}O9$=HmQ*Gt7%<>#HzX6?jm~aEXcO z_K~>S7~XuI(DHy?PnW9D(R~GKRITxq@Nl_A*=tI)J4*xxM<5c_O=gW|9VpTc}ziofmO z@iaxf0t}A)%5j7(YTHvXrroL882cDJF+E$`7iqQMA@~?KxH68(di2{If;7);i~K1) z`^IhgWtF!Xl|y6tdvy7oMkPaDd+ihGAZtWJP&WCBn=#dtoQp^39s4mHM&iS-J13pH zcU&`^VV?OomwWq+dzi@EJ^>Kl3bO;xLE4l&Xc62)jMG5X{HTjbyyuk)@HZY zpm5sFvdWYQ^R|(pTl4%DhKW>HJdz&w4&Uwn6x4AQ?kFRH09&yk#xX-v@J8fx`^4@mJcG z0rMOnC&>Y(p2ee%O(naN6vNH1Nmle>yI|kC^1h-31CLq>0bKf7b33k{93W;Kk@2u6 z@E$dfQoV&Y?id$ne{#L-#X9Vz>>SFVouzhZkY!_fo-F_7&X`#*e+lXNcD4kba`Ez8 z`p2F773g_+eTB*lDWa|Sb*W;lbG@s0%7~%rSrAca9@*1IzS9`6yVhxATa@1VeX!^t z&yCNclE~EnFH;5ydLk&iP;4uA5z*~2D~m-oDGjSQZWesV!JJ*|3`3CQ&hO@qfW5*a zZj*Y7=aL}A^|;{|FXiXu=04R2lg zX0kjc*xPI!E6eD=?V!;{uq?Y-2ci+mFpcHS2C1F^v4UO(8vT-)8!o|>hG79}uy(Wq z+ctEN%WOW=b+jR~QKUS)t*7BxdKA`Yr0Z;dizgG($cc3YBh|#Ewx9->y2xQy2R#HU z4j_SHGIJPejP)*Rn-u}|tC z`89W#SEZhy#wiJKDNT9*kPTH_zXs&KeP9`e66Y{E=L+EujJ_n~87Aa^S+g2Jk{k1j zK)e2EB8+V9^&m$UXPK!d{}cdu%9=`y$!?VXdM}VFF^n*H=byn`i(U0iZu2|rsGuOX zDd_ksYi$L0nU;d#g{||TdOC$rsKJIgvp}L1GyF71sjg7=l_AKE?b9t5X8LQ`cpF~* zj#+4I0luHWf+|SWbL60bDJ+aBD2*v zI;7tUNKJC$xcZN>WIU>0(3eetUB-1-7Z_4Uq($Xb{_>RWJ z{}_!t|3h&9zeeM~Mc$;^v>ML0BAhNVlQ9z*sMSzJ5}PXI%uLFXrY6mycrmz0fb#pQ zB$K}dIkN*(-!T90uRfQ})<<`E{b`3o&Yb=JW-sz=o*PUe@>-0L0)d-Nw|Tv4U~&Oep%xA2_{G&?%37^_kajf0b3&?#seibz9Jpxw{E z7zwDJB}BRTV&d*4QF)(}LhTxhsYf9xl*DA|HFAEjS*?d~TbvFRD4?EnnRr@Benj3C zC^%Oom~piPR0&|j(k8sOOme;7u?1QsXz`zND*hwI#Q$sX+h zbU{>@+-quV?mhKGa{UJRw85-Mdexd!!5){o4;#jK(3OW*6=E{QhS$y%ndu5^o+&|A z>?up9Ej#J6z-V0|3XTRQh|GlNQgWW{NcyE|m+sUeQj9BoQFBQr(Z`SBpgKLNOd3FW zIdz0dN~YAw;@>BHAecw2)N1PgDsq*Hw+7T|3LyrcN$dai6$-ElO69IVcV4dJeFXEw z?mtE3ZdYzU!FnkwocK7oB;eSIhbM2Rbs6?=kz3SL^m)rOyJn~`acNf!BLr$}) zTV2(`#OsRa$I=Lg&e4Jp`Fm_A;WFLBXq6_znFGUFZ5k(MS9Yak|I~ZqqzHaFe3r3E z=3CQEI;FUj`Y}sac7C;0{atK+R9=NQkuhRuWpq>nsFqPO z@a|4V5^e)$Hw0K-Np@@!vujR^aE6M=O1CH39C2FrB#K}6l zwhgQUOs*A~N)Diwp+5cxgJaHqXs3*Ce#bDZn$Q2VG?K7o-lU-*WO=5xZ=fv%Yhy;f z-v#U(xHMx1vF!ym{=)MMo+X>mpE;De0k|}in+@0}`q%tRfEv2_?c37o%fj5?`vJ>g zkd-FUcZq#H<#e(!rvTDk-+)Sr)3w+suX z5`dm*bxpnH+izt{+f zP<%<)g=oeq!qt{#DsYR-`sc97s478JiyC^>Y6UeSB_3Wei4HG?g zD&x=~o%q5!9#JRb;7!lOxT^wMyw|m?T{=uAd7ug|Pvyg7iIUz?kIBzF;9O@|zKO8( z&*fWNVeAgkN5W~pU2-FRwnBc(^Nw66?2DMRj3eD}u4D|NHWSLI5qC=C@4xMB@3r^Q zI)gK?KM;2m;Sg+yETiWj%&oMjljn}^5QKq$iFn=6KY)MLAYD~LKfUxTXr`cEnICdp z!|0K*=~}1F6P~5ssQ|e8-6zaojZ~Sy?UnYnhZ)Z>4q2s9xQMDT%CE`JNh2DwU-uWD zX5Og{KK0yC$!lEppg&{q_Lt0wOX-lB-3Ex?c-R;G2KE~-LgwA=Z~>7UA1i;7LGCs_g@p=c=Y zf7+X|k|30YSXzt`0bxMW&^{5(=)%nc4Ji(*Xf<;s*Z)L^3c9xgb=@p74m?XE^RbvY zmj+Eq_Nh?ZrE}sj!mcowNNr13#tqgJ44&v#mTVeekkN`aoyKqh3s3PvT2X+T^}X+=KVwzNyThRV*~F#NCICfwx-gkL1IhN zqdQPQx;dE*5`D=26E5~;QB5B}s=2w3#f>po31*pPBN^Xo0D8erdrW6bC7b37O+(XF zD5OirAm9c6@E5^#dwrePyUs87_iMqcpJKhClq=6t<(dVvi~5A+f#4z=M&GP?hv~85 za8M03l-qWGuBziI-xi{QLW6`nHnVQF)F8ZuhvXW5Z#xUQ?vOg=IX8f+nkFyS);4PxEA zW(!Nxctc(-Ith%G=>u648pi`aW@#3(xG?07Iwr3>fOpYD7&8%gfs>^y`Sd6=B53<9`)UUxf?0(XMWh(o?vaN5immylZ^Z+SkSFhEo~k=D** zicvNx(;vV&V`j&2gqS<@4U)HV#*GoKqEx>ppY<|#E~EiD-&lTomI7{=TxcCkECcQF zR(H!ce_myh`OXZ~_PT{;UekvQkXW749qz2k4bje>i2qR0Co&C|q3+ofPOwBB)xc`>PUnuPd)GT3iF%z^kO|IJqmalyg?vgDrbSO>WBB)cbbx7sqF(d1tDhC z$Xo_2uIy|Phw|4Lm#GB;wbwbU{H)+ruFL-Eg}s~dy~ZqM?4tCB)gznr_4Q&uyMxXC zbcU!8j-NRD2&WailAAbfmMUhi^y6KhgOaS05RJa?nDnFQZ$#_Tw_b?+E}K{8V;SNK z5#tQ2pSZn{yJpYDQNb98F-2!{TgT#*ISZ)))g8>cn>}fgNYar32fvJKtfL79veKqAi?P!Fdj8Z*liE7G9u|9VhCOq z*QDQfFS=xs{c~%X)bs%d`8ojkhM`~Ymp|at8Ob@(=#XNzPctnRTe?9h5vRy2o}M() zJ?0M{pvK?|X4mz*+Fo4>rmr{aw+OH zI(tJxKkP=hc@$%BNdT?vcd#+ywR@X<4=uVwZ(#U+cNQ18;WrNk{*>O{(79ZpAr=?d z;j+6I!CMwQTyxLuOO!m1Hlg0!Ejv2+_sPZxUqCF+2!_SI5SQAm&j<#U{Cqgla4Wy) z_Z$qZ4?m^d`)`l7H1w{A5;?@j`BuAl9U4(p#SD}lpr@1qI^suBduEr{#BSwe_D&_W zZ88U2kE(XS(f2p}Kw&W1OwOUwb^LSDWl zHln_Glf05x0v{JHXAO|}q8(mC9SisrP7fTHeVjLLEjm1%J(KwEYlBU36QP18#Qpt~ z=s=7mMX5F$(W|wP6vNTh%fD+Y`GP>M4ek3L{Uv9BrSiatUi{<@TgfnaFhHw~;be2r zk#yd$#*pIVL%N)-t>(}jeSR4SQjK7Br7L(}H4?Js*<`;t$U1&2U&AOiy9D?5&$~-o z;0-qv;j)gl-jEBz?h|+ssF%H(fbVpTIK-(7k{^NblX|Rejh~xPo@omv6aN1duBy+I zpK18kiNMDAPaP5Y|ED7owXt{h__uy2S=mNzULMu=N_D9@2?IiA%NvNyRtAeAtV8mr zF_|1bFF9Ipy4EIeESv z9*<1_K#y1YNm#vye>H)bz*s9JEY^i?Oj8ke%Mjt4EC2)CPGY1nOdMiv(Ad=2(;jbj zGRFS6i5{q0M{{MJ=Gi!w3Ck=R*_kdiafnu{YGv|hv;OCz>G1_7gTy7xaZK3_e=bC49~MM(U@ud*us<8G+i))CLdmAvR9zDN=>de-=uDMY z$q{d$!c0jgek8(Gg?*yK2y*I|dcy-aMoX`Rq~BB>tXndnujC)03Yo1doWMIJDY4Bt zooT`ndqvCw)~zZovET`H1Nl~uc{bkVZ=h+zkKFzUP~cfXwu~1MSDE48bqU|!b;#u?ud?^v5mLqCh{R zt0r^dRiEs=5&P94I{(YN9~MQeZtiJWN2a%}Mf3%pTnUeLv*O~mLYh_M$~xQ6vmy2G zT^Gk4PJ7kiVY4V#F?Lx8WOa1-;IBRh1ud>CBnr%7NR9obj1mRyGr|?GAXy||Y3h*k z@4okfdRLqgeJ2(1j&~uAJIaU`s( zvtMVJmJqMi=MU;7U|;s<0akpFxw7of>ylWc?y~((IaIqqU?N782+Yk!zWh9?H>`Ol zg^5^rTAIADy(@wdG^)lnGTEP(!$~)c3&amnx#nnmB6g=`-&Cd&s-!x*lS0%1K`F_i zcL(@DmYDe-5ni0UoXMHAFbd@WES_I?{~8L6{FWPwzlC%w|D%vD)&DO9-0iI`j4Yi0 zEee`d&y}=9QNL(CHb}G;rD)N$tfdWMq2g4lGy`pvq`)Sm11R`9C0oY!CIMZsF)wQG z1$qk#>GfQiV%+-=T4wKsxYJvp5<+l0C!w94#}_&G+_k)JU+?En{6DnCSfgO+MDz9? zG3gDs0)V=3$?l~1zh$7Xb?5C_0}vaqO^L#GGD2{$ZJ9u`#B^3*$^swZd+;^OmoNHETJi$5l@!xAiIOa;tSh&*MMSb9~+&`skY z3LE1#6DcAwAEQ`*@D%Rp! ziVAzubqDq&=2q_U0_jXtYt(UDiL_h(RFR6NS*s{23mkRKkEx^Iz2@ylXCj*Vj$9{B z-C^9EVGWdf;|Ntzt{bDsWzE%RV+T2V=dRZ{@vr27qv+59AjVb5m@vt}BU4V{ilPaNYu;&Gc7@-c#RkSMUsS;JFxy6e?k^_n3q==2!FD{d-V$T4AKauANq88&Gq6KG&IO*=P!-`@t77jl&Ol{;w$*DhyEJm z5;-*si4Tre#ZbI4`E3xymWoZE%1Q{+>p;b1T78GD@1`i`W9DluJ^*K zH_CI#hvp3CN(pkOKChaJ=1lkm4Rq!Y!BX(xR1#?x{tIM|OfBgf%?lnuEk{kj2SgU& z9r7*2{7fL7CzQtv(cO<%bja+AFwQxx#L(P>Ta2|hL`Mdpi%buHYgM-3k3iR-%%3|5 za0D}VKIaG{wS!X@o*`Zv2A_=(hEqihGjFlUvZX;uYKPq1`t%I}72UUq31qLw>xC(B zM9h`3a7N8h>huv%YXioF(vu4e?XoS3Ty|3#dG8v&DI+AoT0igaI--KGh}82vIErz* z!qo{h$zEVH@g8^L1=9}jHR!?KzW*!fVJO)k;QN*I;QU8oUatQJ-~LtK6*VyWBH{n% zQg5b;h8>aw{Kv{-U%Z4NVo%K)X`nGI>|rhOwz%LoC{p2HgxyFyu2i_p7Qq}bV{*%n z`xJ2HpaQ?@SDF$Z_#BiUVV4+&5V@DuRn|8jT~yTW-#(Au`G6+2vqA|6!j5{O?%6h? z<5P};LnS~OL%+#lu-j}!00-yLS=xlno6efCD<={jvIgaNS2_Gh2$cgTN;kQdB;28-~87zA8v4MCdPX>5&O~e`~hU^%UZX=_)a5U$|7) zu+A>Y;)9ua<}_x9a|*c{-Y^6p5dT2AGDdUI32f+ERn`|XQ43$Q=0e#GFvXth%Prc$ zc=8NkqU3;my&Pn`VeLyp^F+QXPZ$rO!Uyy5%SST~7{vspbAf8BIb6(K<+d*No)~%Q zsY`j?F2$?za- zAt5oFo#?)3inQ0f$TDu)LS?F`EkR=7F*k|GX!FpP@z1Ch?R`-dZa}9C!m)0iR?!c0 zCrdJvW!TD6x1*IPD(N0(``#WD>C~_K?FzG)cjVm>XS5V4k2WaI$qtMCYR@-R8EOL! zf@G9IMj;Qg$?}_D8>Ql)IO73EeHx&NV2tRh_i|PH)t11Rw?ieI1@k(_Jh?a;n89aF z`mX!m86Qg6hCXCy!BncT;oqKCYi**}b-9Lh zzDnr4p3<43?XMH$#=ty08DW46_lSmQAcg_~(_FVA!xqbdNzYyOzf} zbkH7m|C$htB@8;qDDKl*z~@}FCi<+G^Nh$DPh!iNNAIs*jxCof3%##W5#B$RiunJ( z8T5ZwsMY#cq4uMYMrVcgHyGWo;w8-$MGfI=!RsE8TnT}1pt*LluGWjzMaFc*_tSj6 zWu)){|D#gNBn6fanaevik;-)Fy_vyuIQH}P;~ME#dP9{Q#5!1!Qz zj>i-{%;{jHl$)uPNg0EOMqbqcl5NwHQ*C<^i{+szvkVkV6cnelYF@}!=+}I)Dzs98 zyq=J4N2#jIDcc350**(Y%1rKXTasC_uxk2{DI?vvzv&n#D!P-mTiGsZHj|uZTFS zLaoeonMOEX2^9OOv?Pdg3{KyBeerh%w*5Ra5~)c zaVG}R^Q%PdEa4sIaf$m?f`QC7D2aT@gx6<*OPMu0_6J*n*I$8b5+>a6}N>3)Ev|e9$Fv52G*E9`!!6~ z<;{PH?f8C57!x$LrHeE{EI=9cOEq4V^0KDhoGz54e;8`S^T z=JvM}LZ*tA9oAQG6sfM4jaxjXq~BB$s*(SBfkV~Q0`N)m4;J<)i(K)mzB5l`yN2cO zUM0pqp)aozAo!;sW8m!)pFp}m?5@~KvoPq0W%Uzt=P$-GI1bY<$6C(lqJ5vBx=g&) zyR6j738NQbrWEECs04-HL8aSsc5|ad0EW@Nth(E*c+lW^ryhjnZQQUT#k+{T6fGSL z8whT~<`5IIdr!E%83`LmIhO-S0=$HYewS^qhn`s>m<#NPs@&L7SX{(5*2JqafVH?? zj%hAfw9=Ba1{v^*b16+SuPCyY>qZj)@3t+(9*u{qYwLS{M2n&F;i9rbG05=e>wlrTQCR99VW5dn4*iI#9De*nXh*6Cjks2Q-Z;O zK6?im!*cLI>Rp&z2`~$B>N4I+cUG+NnzFq^U`Ae9i4=*Yd)B&^Hm3Hxl>1}1RR-j8 zr|~Rx6t*vl=|&qkFTWgaHRYok z#>gxR?-npilsG7aBuu*0&t0d?H zllhm$MK8w@f=333X25E}V@Cg-d6KtrBtW*-R|5i)()`ZUXkE`aEI=VSi z^nrVyc~;O_uJmDK7=z2cV@b7yM& z=Z=;8=>xY#I{B27?(jtTlhjAyMPP8Yx3FO+#>wPNic(_3Hn(O(3)bzdQ znyHcW!9tcFJw9f}HSYj)WBIE0Z_<6u@Zvi3kFwx1kJffZgck4j9*QKEiOFFIX>c$l5Ao_dv3s;@371T(+qAxI@F!jdJIJ- z#yZGvEIazoeXk{-pa40$_bE9pdf?G8r|szGLyUL0-}49t=^yYq}K`&3SDpWC7I3=BhjBp82CA;|zK821mu4(8= zWDa}sXs5vvy(xacuqVxa4uUGVDrG%~E}X5%^E1EZ=qNz?ywj3;`XPH ze>A)CXEX~oBa8obZj$hs)+3ZKQUvAsUW^$#_$*+ak)8?iFrq$n}Ub{N(Bik;l=xNggoNVkbUh1%aeB zlenb1zgD0XUxufsZ0S*7Yil?XaSqzr5x`Zko>&f@{ZlnMVi%dmi~Or-VJ=fJ9dz0} zm0pMu$tw7fz_Jp^JW=A$>A*{QOnCKIdTsSN>-PN1eRlt2dhNf9R{uA6g>*v_| zuhH1m*&I4CIE-4a&bxae!2Qbeu4i_J)(FwzeiWSu8!u*veKy=Tp&~#6XpypbHb(MY z4xWZNJ+f|?I9N>~EXG-50--e+cbITr^@>V|yL&SqMtG53upu|txl8`kg??^7{zH2x zmnx+_(iqH&@}cuQ*oJZ_3u3Dkv`*PPTB7Dr2|IR}+0QuhYqV=ye`E5`<16+D5V=5B z+8l|dsU1bi^FRsI!Jg^8b9X{aKxgP>yK0WnF0HHeS#F$rqBXTq(02EyT7NZ%Tp13i zVP8PjfoD|p7Nhm27AU}(re&HMFFNQB-4#{mnPavbVXiAfRSBtgKu^#x9Ka%%m)ygG zZ0`qHV%0<_$R{zKjQbI*O>z!oQ45qfU{)QVlrMRVM9p%{CvbqgEP6{+{y1P0xhLWe zqNgyxrakCZ9`EWQ$$tt+eF=jSzVwGr)IeW6;xD`gUTE8N)-d8`VtzoT&y&~&#HKe( zT7|lr%sG&xa}O}iCw)Tw3*H-{5EbFSwqffR#Q*y!j_JRN;{La7sAOSdZ~dRd2*0>U zkpE+;G=pT zIa*l$-h?S3Ym{EkLBxEyLVii1VxiWOEIoR(pQ<+)R_fWdJ4gqxSE`0Y zTtKLE&1|{Uv$@?Ul+_)kwm(7pSWs(Z##lc3t9uR6?@-ugeEIt#%13E$0RNP(rxt74 zN%=fM(XmHVQnf_*8kA7w_utCW80L?D#SFwZL5Hw_O;>vA1DJKR!Ljvh;xr* zPiwqUekGZ=PjkY(_&()o~YNJ~j0)4T-&GUs`bl}bGCNHFC&795xE?ov|8dwZ%}rdZzCB>kNY(PJ*x{OQ;bk$TjoTzjfnRQdqp{}CnAuZ=E5f` zvK|AOZo<(H-zQYRsb3zEs0Ls-{6=VHrv4434^uPERa6EzGNS`=7t~Aen8_?Fn5)(Q zakQjwDdk581_DC;`uzVMlnDMAl>YX;gJPxRdiarpCQ*!w!**WZ`D3~U04%iL0=WdS zAr5>tVihGc77&K-7PN1`ALP3?AS90lE-z^54Squr+?HISE5!mAT2#pCf?{h^Q`q`mkM(qRRy_1WM+#xWGEp38Fqqs5%D(y9_8v9aa780#@uz?7=Z z;_gJyb<}L%uj=%f1o@1Noe58sM$)sQ%v^!u{P{sQsp5j+Lb^YOajA?KY>X+{ZpG5j%n57XK}7i*v~8EX>XY939u7?X`2eo_R~+mwAB zjt|r^?pghbYtBh+ebkh24G^iZooCjhR4NXTvayDY>%RgWHp*Zwm#@Xd|3?o)@?S5e zy@8RHftd-7g{`UG-xf4ec2p9S0lxf!!C~Ou$Xr#l`FR6te!Dr@Y4R>R0F zl^EvM3il0&Pcni!1h*l*u(Yk@!t>MJ2gKf=CP>sEbBY_V*5JL%jpS-t=);P{>&WG2xa6OoMxZ^55e8RI69%`5vjhNCJ{$%tcZIJX;7=10w-fdqd0vpQAtw&;&w`M#~ zp~}f|qd-^cVPgpl?ZORK=OLNnJW~3uBhxV*nH8$&(^H)N zEuiunq?CG}qeOx&SQ%JZZ3#?eqUD!9?k~<_zQ34l$^?oVH-UhF{`L9(y&a(br%(4a zdS-3m>_MlZ3jSb^In^~Dg$W2UK6@ClQRg<%c`{)@z|cv)7Xs` zuhugvxL^U^=dPN);ZTisFdi`u%A!ba?i;I5XlAVswftAL>u*uqs*W46>qdMO^h27t zV9SnAoObny?64+mKP28;=HY`T!XiefjtxJ*aV#@4W?47z1cAIup% zxz=fQ8S8cKs8-15c9BOimfNvmSx3)3RT_mPiBYhIH>`?vNLj@F_;FcPdAfWqUDcdt z0pWbW{@HzS$3F4-!tk;Arq?L9_p=sI?u&K=0krG2#=Nh0{sEUywktQcmb6&S+ES0l z=Z>Ca!jEXgK3+X#^fG&`HC}iMHR?T6&n;xXxa>Y%o#xmhzmYpz$Y$O9=#qx+X+Pml z(#zm7h|)T;tyM^?-C=vYb{(`0X)CX4;h`l&5K8!SR$g-F#|2}?`E@eSq`6cd@rZiz zizMP>b!;E$1=E<%=kHm9^Gn9ex`3iiQtpd0)IAp_*JdYJ%ty9|wA_k|ygwAxWW~*m zGQ-6v&iffR6hSsni^qNAaLuaVIz+s_7A0$N$0YCajKbe%&xp=Q@qe+OC)uQLuXWQE z3MBOO(QkdObW8RK1o5N;&PeGT!+O@tgcrm(ZrM`g&T7pOB9 zi>!MJ9YBya3`1s|_012RX^!&=CioI^pJ*3(8;3AoWzfVleKNx%igrwO6BoWxi&_xf ze*zfhj#z;^c$!jJMPVlmvqYDv=Pa}ASH#;UnerKFDpYJ?_w$cW%wqNi36+NDSh6Y? zh!>Qd&{Dj#{Cts4=3OnAB!5yD=fj*L1D{SNKgG$Vi$CO?Rtx#qsJWXZSp1rIQTlo+ z|4;eRA;^mw@Vj7iQ`LT6fEKTSU)N>A2^?ejHguz)x+EGQE$H_wSeRye@kD5q5_uAs zqb^;AYBi9h=sgOZ#i*_W!Gl35;9JG6_5_##+*f3u5&leZ%sI$-UQC#>C55-tD50T0 zqSmt~vpPzN;vX0)63QwwvqgeFlygOb?;+Wx8oT#$-#Q=%?LAz|++bSL*3?*qZFZfg77p1BM z5xU<@VK=7n2>WcRjQWn{68rD~#pOHMidfNX=U&bUEa!Q`c8jmTXIkUtx-c=Z5Gj3| z*JaD0_aWD2%j3bN?ILFVv1}`!wmR zvPB4{qRxZqY$B+K8E0eCMHnwvOAWUxHJr@|)=x5bTNjuoutk=VOlwgfuP(9dYeH~a zNoq9i=Y!EY4|k%j8`t0V8IA{dlo?~mc1RM-3DXvfu+@3^d(5vCJ~_XpvQPP6!h z%P^Oz*5FlV=*;E_drgMYHlH+{+1x_-Ihi;Oa@62@d&BZ7v0AcF2+vdUa2%Hmnfp=k z9MNZD(fszo7YSNvATgBMl!x$Brj|)4D>}5`tazA`^}K(GftJPn>Zar_SQRW1@qAJ0 zcPu;i8sttof3YpC`u>=eb|?9>y2ukLsle)4vO|+ujhbRdeGzsRQT(ejiC&O%;VO~8 z9S*=baMch+^`tI_x>-DQtUd^Wv$>N4t@~}ah;iNlC;J3)r@d?0H3w9*HF2UtiCWDX zl^HSAwUo}DX{JW24d?a2_-2DLRd#}B@VrZmjKh9rfN7O82Mfh^#-)5hp$^ zJ!dr)lh;5qV?Prch=INuJ&6+7k71cw_lXyF=Nqk~OF~`Q+X&w|OCK-zkL~A7Cco-a zibc_5K7bU>ClmKJnXMVOBU2WZ>XJW zMS*2c!ir=P$4-%~t{qTBs!%&c?;70KRP9-!-guV&le}-o*V)%0x7}Qlf}I@(`}k)( z?ogNfc^q$Gx&_;*k3rrUfBJ;gp`H&Oa)LU>=>!huV_uNF2^y~R_f@Bt(eng=6_)XG3;T#hN%;qlp{o11>dMx;;WMHMJ8>c#Wa7yh+g~ z@pMH+*l!dXsACP!c38@%FpWr)R^o)B5K|n#rdInXBpq=#877IJ$EPTX($VY0(CcU- zKo6n_57C#AAM3ghty-o}ZYorx0fyH?84_2^!5i!aNq_)S|P=QI@JHAbA2}v3Ozb3Nae!jtGF# zoANz^xEl^Gg<`c?d0LCMY@MX9$<_b$RpA-c^t!B@e7=1gv;zuv--G~;Cf4LZMS#B+ z_J@=5R!^FWMu94GA5ohm<{k_SX%_wg1^4Eyd$2(#Of1rFd}ZwT+~Y}`XqqyKS&Bln zK+~X3m3&&0R&boA5^ZB%sw=DV_<*8RQ)-$akg=>e`BVH5!#}&#^@K=r}S7dI~bxd^wt_!=Z;9S zF5&nXC$ds}PSQ$kJ>z%qvgGTLYqTW+tuvx#Wh${g^@IVd=cm1u#R%{igfK2Q$TVmy z(>IphN{rxYrXmVjB%EPny%HVJG8S$(LO+L3h`<;dxiShd_}%aWS+DJ__>H8)^6Dxe z=d{1W@rpu+gFU3_bVHT#=RRd=VqJPI%2O_lkDAHcFWEMfQdmFNWa8OAnz=_Pw_>m+ z3{0JNs@w(03pDa!PbBU%G)aQPUT^<8Ne{zgV_7gI}@Ei#=?l zDzS)Op`*X%aOmO z{}BH#9#C?_DDi_5LV-Z|#^YWY^WdzigCYOrGW-f{V!XPF^-h2V=i7F_EssZA2rjV&7MmT6uUF@3}I-txPo z|6Gw|B8c&F?($vB6;G}k8)}|HPNbxExLtA_dR%Z!X2t9IeqNga;cfec5v9n}m*hft zfZ>&f5LV6H)`ZiBp;`uRTb+Sz{G_PdkRXqh+@pUYeqebkxCDskiCPtYe;JI?AA424pW{ zb>=|KTN2?t6`H(6zWG~VlzpFMJ0a4!vWQd7r~q^wTU#itF5DC%0c0=vhP8J+ua083 zq3_BkZ;UY>0D4I9A_rTbAF5kbFO@kA1-m#`j>(yB{XAs$ROR`0d^|jz2e#cqWyvCR2p9lR+J*ZTx4OWP3mYkt|j?mo8+UhIo z3)1mEgqzy5@W9lRp0JsqO_fr58;}pCtMmzi=&Dl$6&$1g3=g89e>B z!eo5HAwt3$e{QfJ3w09kVKkNUQ@8PQji6$3mzx~@+)3m0KmnkH$I+?EF z*j%UyEWXR`_P`@cAEwVBSgN~nmwco#dQMP#hdAAE&C>@x?MMDo64?+bRUPTNLFzi| z(w-SVK8qkrK^Fxv)f_4GFmx(|mbif9x%9UzbF6n|=a!6x zbWYbQbTj6K1T}+DstL!MR_Y|cWWC@K7r}}>)Fq=AM7v9^kB|7qY6ouz^AT%mNa3r! zP%J2xlV-m9M1;IAOBf&rdl~;~laWhnp*_Imp8Q;W(MWo8&I}OBbe7~9(~fI@g>^uP zn8GZ$1mQK~T9IjJDEquz*-w-I6Vy}jcyH2<8z!IU77rOtxRfxR6A>Ny7~&lINS-H! z;p1qHgcDXr{PT9jae?c9T&i%fx8RaA9I*uz!LKDXYj7bVZccyjQI~P7 z3=>_de$v5Bug7?0MiZugm@bWD=RJ_aHi{7lD7S>ZR$M^>nsJGq(JS%YSTTOg;4eDm zsB1(t9-3f3A^pqiJ87p15`6Vaa{Z&%7yQ3OB3TPNMj-=x14C;QRU2Yq3nzO6XCrfy zzaJ?w<#nXKDZumWE}Cj;J`~);6DZKpJ|G&<89)K@iJyMXOX+Gnj$G(W|5*^?`;CV( z9!DVo@4C(CbU^PkG4?umiuH?8mikP6iHJDD7K#Z!Lx&k)NN8Pfp5|!0e*?qW<5QEq zo^zH8ZE$O_5^t1Of2y@)wzlB67;gYVfCP9LV{=r7_JVpo>|(Jb<{DAc5!+~~WHsFI z5wF(F%A#B*%RjB8>L?}h)_Vy|2T(<>XJRaWe|b;ELEk55s(T&5gPFw=pZsa;_Xfo=nB#NjBQ~F9MHU49AmFNH0T8dg& zn>hW=!DK4@2bl?)B$^~je(@IB!a$c4+0)Kqd`X;gsEu_GjNI%wzEC66_=I)u2Mg|B z>DSCceo2M~+u9bV$yBe2OfTQ}&L=2+yaq@u1Y9KO8l1hrs!O#jv(w+15rA%GZ%H=bjG^ z0?VQY?K0f$^)=UBMOQ7%5n`plNc!m3>BgVANGf(xzLHC6pjh0u3+BA-zdCUoHA;-? zm{lR9kro7x_9n`H@+c!x#((oWJkW#RSlhU6;6Lvw+^qLmj{zB0VmHJ`Mq02#d;>_G z9LNrShqMu?b7@$EROwm$T%XeO%H}wSq=R~O;>*B4U?x5rbEH6ogn`@?^s5f}_9>Nt zf=)-cGmCj!mNyjdBAv`pLhHyXda>@grr$DR-7@lLq(+`%&A7ybyMLq%Wo_F%c~|I6 zKiwrnE;`J_8nC$aF=TtMxzmmJS6#4KkE`};m+*aA{lCu{NdEuYB}&c)w#EjI#zJ=X z9&-O>p*nt57K;HM@VN~i&zu26Q?Ne=35=%EEhFU=*QBg9{0sy#0Q;hmb@7EZdW-m9fu zY(46|O*apmfqFi>cvh*pmdkT4bAGbO28_w72LUIlPUT&Qk8WpYiK+|+O?Fd46i%X- zdJ^ixK4qe-Cm405Yr&xf;irwsEMCv`V5*R>mjPL;W!UPETC16@XA-=}P?q4f7J zs0Ih?UR7q))gzNQ?qz}50hNJQMqLCj?ciE(7+lXEoS=4IC8eQR3mkgIQ7k~@y=+juyo1RgQyeSN+ z;mHPVlTUS8+h20ZydCpU1z)=a@gH}|f2Lmlp9$)J;l=-oQ2!6V@HZ5xP#t$#RfhlM z@g0s8iEFjU$>E10SaLurl98l<0^Vhh)LL{kif=@QoUFAhBa#w`V|p42G629pkVEj= zPD#TaJNHq%|x|rgK>#Zva^vGlSEHOKxB}WtFuIAo9 zm4pc^xxmcAWn(`$jSVm#-ZxELov&}0p)7B1HDLrjbP=*1acZsW(P^k$?ior7D{=HB zs2ieBXJTQ~uxQaN(5PsPlTl-HZc0SnA>YuTMIK!i%rf|ZjDaZQf6BpFpIg@e_oeRagBRCQiOiuZO4saME;e`7 z5LWu`lr$1aVtd+iK@GmvDoc{V&5bdFEguTeD^;`R(>d}b;_xhY*#KG;W5i;UICFoo zo`;jX$}&#Uf3kKm+-8FpkltXNka}&>$U7B{dE#53yg0(=o9b~4Q=j7S4w-4X! z{DQNy`z>;N%y8EE9?+Q2#d$54TDX7nLpMoaB*n!RIxP7iF?VJz($dk7%SB-+L1Wx| zW)GmmoW`<_eGw=_5glLqTTCqa@;S?kSuAI#MD$*;K=H$BJhI^Iivfxzu9$$ zKQ}ZqKtY)vK-fFxpsCU$0~StBLB7ia7!^BH1+;wTQDD$wV*<9ny5mRZC0rBd@dmrN1wgV;>zfNm1-}1$VAz$P*#msRO4Ur7+ z#5pc0jM9&wwiaY7i-WIOjJ<^t@bnQkJw3!$monQ0vAV5rlPUVdZx#B;ckZ5If6oJ* zXBL^AExqm0zIEnVZzBD{3)zew+(H|8a=o_m+_=-YgWsJVLL!&D8oLa!<_~+Y)#$*2 z6nSkd@BIFR%ky?fcS#7^qWkS}*QxcE4(f(Vvmzi@qj!>~kE z8#PQZY+Iwm_FTii^a4mUSHf$Smp${@G1!hoeAt~B5u zuUo<(QWWURa^Ys7aVb-j5c-_?aJOsx6Z|~@SNPnDy>=%$_Yv=5RhiQ_rBo?Q?uUinKISV0Ux`-*84cUmWhnuc%7m6lLUoUAyAa{Ie zg_BF+X?drUeYaJO)1~AX)u`64%kU@(P0Q0FEz#3*l@Y57L+Pkg`b9BYk4?LH0-Xh~ zIk0Bkntf)k>*$h~A?;+Nl#m>>yK)e>t?JCQQj34KVPo5DjHy0`5>}$kDb$x#L87%; z_=}3MuWff6{Z!D&CUs=nQ1X^A0!M;SZv`<;sLN+f%NU(=JY)Ojnv&TPA`zXZ-?dRa zBbDfvz90I20{$|077g#w5A%z9>NI%Lb@HcD5NkKDp!WMmkgx--8~sTUUlne)MUt@8o{VGYoU z2r|S1xBZccrPn2`V-y7~5%16lsCT5mCIyFfr~q6=4QBOTMc*?Q@?i0@!5;LzD2IY# z1`!FeO+~r>)FnW7nu@pUr3&GfqPfl(4 z6bN$}fqFe?bNhyq)+n{xe~rZUu(Vuk7LuKL32(bA8B+=P*88l?nMr}XF#D|Sz>z&J znYE+|xv4K=S?=1u301Nc6vncaCuF0_r1{u&PZZGryLzvDAB&ueJ=rH5zoRriCG!aj#Q2s>a2bajsfy<|RL2py&^!;az9*zh zZkN3um&gJ;FU35V89H%q@%UUQ?rzpQJS&G2xcCOYV8}S4Mb$r+hx-%7?}@i_J@OOq z6QC3KvajOES^R~~wS`NmSVETW5f!{6E zKY^dXzXd-rM*{2gCG-w`oxQmLLwS6!#k(p-+`;I0jah)VY>yDBk(`+kGw@B+YNyw&n|=JA@ZV zn@=8$C<%>nky^&rE8oxOnCIKCizRK0`)h@5{mZ zz~&`VV`7HgK@cdo{)gB=Wg<<6)sVpyq-Zk4gLn0qX+Y8Ul&;)BGsAZQQWm}!2buE6 zpov37U2%Dgw;E$h)->#Fee-CPxeQj_v6;!e6)N0u`wnwPa)#Ntat9%r#CpVD@wGX3 z_Ktyu`poglAe%}oPCXbojZ(|A(W6QlnjU+bUV!C64~6ZqDea7#XoH_SLmsA6X#tE) zrDRnJDziYDq8KmSY2kzzg&s?J=>0eX+vF*7JRl*9NyS!+co+#8G}=UoGoX8RS-SP@ zDC01L=|WOih4c3T6UeC1k@*lS#MHdl%kCh*IuIY7R7lu7XI>odS|(Yf<`+ z`?wlMOLA>Y>LqlZygtbF<;@kQXiWK|{h39HjnN6ss&xb)HNXtk^p8+>AVj3WVM-;; zV{^LuK3o;YuW}m-`9V}XtYmkit>aI@Xc&CuluC>>fB2t70E2PtksLuMUB_)>JM@jA zq>I6se7a{Lqm$D!lv;7jWb%F3`C#VhDCXxr^Zf2$|&Nx(a%L9?S{5{5TMo_QE2kBlg~EuO6m znPIGE{BALZAu}yXMgHsy4~y8iL(ZH%@=M@qsu7DjYMJ|s?8#>MrGTW<*@*Rg-&rdC=CIb99}2qsRz*j~ zF9B6zAfDG?3IWb95vtd*Y+a4=O)!(3ndmRr`M=)&KRzH*}XCvXsjh$Lp3m;EkXzl1bK9R)^)+SlO)a+OjtO9qV+!%QYuz z%(3dx>A`jk2jvQsxPHHL^A=m=23tS=I_APwT2W+vfui6)Muh*F3gdqsbN^3J{CiZW z7VfpGitnP4lUxzlQEwlhTFiWo;9VNDgqs4;RkWC;!n zZUp!6ivc~Tdw>ZRy!?2@lnQIV;pQ6cY7yvAGVHc^)#N(a%Xy;X@V$BF&*$q$Fwn)| zA5Hi!Z}@1zT?ch*SlXa*Ud)I2mao zdSf)a_LP#~RyVv|=`mP4uhBs6Wg)wFpiHGLf3PPqZ$Cy)K&jHAt0-x(3OO1M(1fO{ zEm7$OtBsBL{a&rcXprb(Co=3ZN^heo|MmA5f|!+3)WRNqi5WPAlSGX8TaPpv{J5Lr zkO-|A#=WV%Fs)WMD(Wn!OR}*RcX!E2x=YoLdf+-?{DE6AK3l&Yr!u;iZGorevno4;sXXDcSU-f(m>ysLtMl(IL~$kBz}$e@^z z(lOk>3qklZWKsAH5{;s*(;R_sKu)+lDmyHMAv|5Y)i(SIV*?(+0D0q%G&3X**2ZD> z65(Zvif|-JE+>01o$zOr-qlk1LG(wiut+OPt-bW)?fFHAzP1eU&-xpY5wI zGCJv->S7GeZk=@(uA8S9OBX#L@Dm+*EFXf-_4|vO(D}LMyuM7G{1yXlt+uQMo0u5Y zRdKB7+3;ZN>6Xe1t;xH&w)sFp52~`W1CHwMH;&~o%4iPgQ}G3ruYpZ15y>eN2TLg% z$MmE43D!6&E7j6+tiqjTEjG|uEJ1iSnHEV?@TG#DoJ%Ba3gl5Cw=8{Tgkn_-*EuZq z2)^2T&+TfWEOFwxWp6^F{Q<^fXGiHi#Fu5ReLFh_lR9|ZKQKFw_;S7Jr4o#1PJq1R zIJB@4f3;!X-}MztOUW%4UD@6~(<(mG<1e7vxr_e~Y3~>$YLIM;?zU~)wr$(CZQI^$ z?zU~)wr$(keS7A_i+E?wn~8Vtji`u8?%KuA*(}myJ_MX9WYi0p zQ9L%IBtx6>rn*Sst$`H+ol#cUu!`6PP3+5+<)fS^P;2+N9TzfU2=+b)){bI0ad4&c zXCl@v$8*p%M(f!f(_|5^P`1E#1b-zVv^IE*&@%{?4*$xcv8cosy&@xg4`K;?0^z}I z$wge|(3iRRSJ|8HBGlC`@4drBiZwAPK;N_0B1cOrqvDK7$9?snWV`?BF)BTa>O8w1CX>$y_1caoImYs;supsPZYJ)dB zk*1Vy)%vpsWVF`xW%7k!4^Gp~ahQ3eicPw9=Js@-nI3+}%(Q87yAc-bNbJr)poFae zs@4xh8a;wY@+HJG--N=RU>tW39bmyGaCeX)fI#^$Pg@`m=*h1M%Rv09ss0X`eB-cjKW7f(7`PB$Ox4+H7okIIeZ;Oo9pOSDy;vrJ3W zbd7?X1PGnNC6&a9zhGcc8qJ4=qpt870WTEiq>n^7vp8h`M)y5C z_uLSICiei*ufBzV%GsElGkX`@Ar{S^l#>F7?un1>9Zr!J6DGGG4U2JAPBZDp2N;_; zLf6L^SjX0TL_X}!YKXIwBWeXQ=0RkV5$~bSr}YtLOO2%#*~I_7Om6gf`{yu4JBIY4 z)(_w^_aDLAe_x488n_z#wBk-b2%Ix9!@pFbMM@jC3;ggrnVARrrCQ`N169aEiGVBu zfncTnlrs47&EgP8d2r@NH5pZt?T(lEpTBzgneYjM<@x;M1SgA&B=F$b#<-ZwM!cq{ zEsr-|=stdxm!jIEGLcFn%S4*8P-C!{^m*9Onmf()k^rS*oXdX1M0agt?zkj{XJ6x^ zZVkSG$s$hh4+EW0>>M=7KN(dUn#l}y&HD8x$`o>fe=qu|nQcx-W?I$zd+z z92kRGeOF+Zz&3zj9P^QuRaH>{OUw{^euuq*z{bX-Q*0ZBV%V!c&3fVbH zBTMw`;syK^i+ZO<$s~rcfoY^2=4!z>8V0_MuYdjs!UM7Og!sv_iys2ozXyQn|Lyhg z-!e_u!`8sY!suV}ZHg1ZU3qEgWK;UMJKaMz`TcR-F|pR-wZr{)i01{M_bz_{5|Wczf0)oVvW+7)6EUIzgE@;?z~G*|m(Ys*2j+jDZ)69csyE`<+`b5=g zUCYl+{8PnhJ%F;=$i$4sw9z~lP|#0?_uvo|z#-(>SMKB8+AG}|5Irc<#GuddZi z!+}kAXi#^mW`+FK2&5+29S80!SWUNPR}Q5!V8`z8nAG;Yk{*uGevjzYDyOt%ui!Ne25)3%)gGF+5B!fY z3GY~gT)lhaO37T{}7j*7+pOVp@`aoN@(nZ0+4Vv-@=U z3^MW9y68ciO`;&eJ@Pg#U};5PMFsM2=TXGhxrdopDk2`0_N>gl7F)Zj+qbV(Q+wvt z#u1xVUe~j7NK1C6ZiaIyR*y*UM#r-YRo$=z6)1(#Di8oFfNr!;MIGXE+-dM1jF!P8P7 zbyd&sj~Y=DUQv#(HdO@9I=U#m{|)t??HQhiCqpt*2swHj3Ccu?3)!F6N}xjtwSQMc zko3G4j3^>2fgBb_kbhTQxPgEg2hH==SYy<-abzK;jz9z2Q!#L036)~*M4^CTa+r?8 zIk-sxAnBdbS(agbmiudQd-lj!>KTSi8m73LCov7yVzWv>FpZrV6}X57dt{in zFT#GDUYL|P`H{Ra*dDB37XxB6Lk*TJj~Huyu!jW0*(STEh351D4}fHKop2Yv7zYrq zKYCB?RMCP9c&pR$u+WY($yv1YOSu)jES7{f%>HLUS;P%-pg8pIBw@nI*^L`EIFg7T zqrXioun)mf$pMU`sWv$-22jN&`aV)VCMN!mW`6@&l-M$E$)8vh;MDx#d*af4sWu^1 z@=L`DSOvIZ;KOkA_0fThsTBbg*Hh<4V`Gf$U6;RhjErW6dSY!mH=7tDzHapceQIee zEyW>r!Lo_CPDCxxewMGX){vJnSZ4`idfkudIC-3KaSI6*PmzzXv)>&_sYu<8Wh|C+ z6Wy4KVx_Ipux9}^((yzqwU^Ey7mX8*bs!DDb-KzL^)(Jdt!*vU5FJ|dp$oYk5lrFo zBD*2EC=BS2py-dB-D;(JZbl*B4bOActNYt{7p`pFu5ufcSa8g;Y;3A?atBW&uw}0O zwJKOrhEIwMy)h>yeiJ5a2=ywq&qDS|-sR7!ch}Y_BnnLR56=q|qLvJVz*?d<6%x*? z8+~4#X8|9T*!Pq>a{%eQ`{;}IQKz)*pqxI**O|K7T)23S;trz_Lx4M%vwSr2O8lt8 zv9KH2)UcgiyE2Sb;jWy^kEvciy$7zJrS77@^)7c?FB8DSH+3))`{6M{Fx+ zdxm7>@u_$v^X3VijMsPCuLdRQF5B07WtBRaLEKTeqcbl+du@a4@efn}r0SMBkG(8^ zcGu39l_QTW6H%9!MxBo$o zP(NS=L-`$1Yf7A||2E{7Lm8sbSWKk2=L5i9bkuqM!{F_ds5GaMEFk z7(&P3mVh`Mhz1izje-3Rj%|Wbi24v!EJQ9CEz|DORR|>91qt%NqbMuwdnm01NkT%D zEOTP1XK+Rz-tY5iUG7h3E*?EM-6+|2*n~5%F$z#3TqSXsj{%a z9!4FvvbVW`m2_vtqDI2&6rdFx3;gk7qrXSVf9k; zgIjQF`o(S|D39%<(Xr?&{iP|-)l;?**ys;t9b`h})&h^~V`AsDw=++S^I`nRN~hBn z@J4oLO8cO%eaa#|*h2s>9m?4SCdJZn!(y&v<1%G3ZF2b7>sRHF$q1w)a_nMOh)F^_ zVHI;IQFrl_Cj-Oa?}ZBQi*?m>GposZD#Cu}MTJRBP*R#J%uU)dlKEUHi%?8-$+H#V zuPM60Nu<>qW$2I6RUtcxq^lDT8LChtNU2Pks-#3gswhVum8%oTs*1#v zs)*poDv0n@xUqCo4PmNOqQI1!Bg-gOstr-(Yed3S9>pkTl}E}LHc)B~qN0#Jh?bbE zh+sL9N=i{YLOLq2XZ51^Rp{~VQ*t&jW79&HgvL#qWs~nwXdqSQS*^C(cyg!7i+OGrufxiVD+tx?!zm_D zPcbktRugJ$^79y=6##3d$Q3Ys+p6WHRu!0P%WBP))HM~AWtQe;Wi@;rTj%l$h!N%h zv|m8jEAXbM#5{?l*owH)WjVN#pcZ~!vL}=5(7~&54+n%sD7bZ<5ezXz=M*BBJZ(8#E6!Zi43F}w-6qZY9ZV|g6V@wlCJM2}Nm z3DV-pg9l%eA^rs9vtEdDa&3i&(0imsDGr~)o`N7`J8c3~QO?gCaSFEeAGy4FG&5fv zsCCz+26KMjy57^N1FHC%@qa`_I)kRXx!#J6C}hySA`x4NkuisbmUlU$5`jKag=kQ` zN(Oawge`P(ERI3K3&&BNKAab)@ijgPdmSek@SfHsnPHz7B$^sr^GlnIptdZdTs~oq z$CYMfW)`X^m#Y#u64mLU^aIBI`(Y+u+PlA4IKL0h0s;ow)5ihWQps$kscpru%TreP|YT#bq(!X+G zN^6FyTw=WF1i3$=i0|z^DWbXP#)y<4Dcb!d?k&xkrPT{<#?=yQy*b;_D-^m2SPH5KL5l}2-r?R6KFm?tX)(GH-c?POa<06(pj=_lJ_LMm-Q zRaF-GF^ei^uv7Sj<)Idi2cmqK=$c58U=BTQ48PJ2wv_6{!3TL z<6Fu{Z%=fXPbEsA3ws-@DHItl>>H;xTWbBNe)7Bhjom^_qc9Q+u}%5Koq2t=z*;_G zuF;D}-Iw-7IH3Z!sj(1`EHlN|K zuXx^sYME>QV{u^{R?s*2hpn_HPL#IDjFg8A^%{)Yc@rkT_SANioVpuJI;5?*gW%zW zITOI`9r&z+Arz>}LfXlVVG=5k5Zk}7UBuMcO>x=$av=oG!~#BceLZ0Z zqq+IzvirbTM&U4^aq&StrkeW&()??&igEonkAdjxJou#R<*vghLcZvm@QSa(IzKeP z8*MpFG`s@wP0fugAOy{+v4wyG-kjDy^hVkIAQ~iSqYC{cEdrMqk(wo$9%tQyhipQt zGpc!-w!^@`O z`xw9%aiid=f&f1%2NDBJp&bcV4~f&rOM0C-U?NR$E8`dPQih3~SNaZav0`4xb|r$^ z-w?K;(%nXWA&cl=baENG`$6Wg>T?$i@Y6Yn=LDMWSD+i9l`eA7_7O@N(gZF~ir%Lm zc!>F)+Q70ou^@zOe;DZEVT%Bf4Z_he3v=?B5~@~{S<13npkX_auRR9{!L}5xVON0$ zieEEV!#O&SgYFgrsKXbeE5`o12duX-r|AXkwqD4W2qWWM8BW>EnpO zO-r@wqXB|9ag-+UKz(=DuDqw=F59pyHNWMU&5hT|^yH*v0@Pk6F{n zf*@bmn7V61L$0xl;+}j=^SL)`9|Xz>qMPjUYkU(7H&bO8WQd<>W8}(BlY84@F zH({lp;WG|%ss=0k{J>lnJMOR%J!8k8Z)g@GIFoRb+Q2r2^uSaM znvFnsZd3Sp8+u0M^}S(uMK5%ADBoR28+~9!Z*L1&=ToMH_aM`l6Vj%dg9~j68L$CHf}teL50@!wh$}gR_r&&Mr#u z2$3a|S+KSCoJ8Py8clqq&^Y;z-ZGifqv2nTm~)gX#=@jq?=}AE#<8i2-L25F@qED~ z_l~CtYP~A=lC65zfo6xc?ozrSdZSkI<9G)O_nO?Qx?v`ZbR{R09z4|vZ2A?Q2wnH2 zo#M}XB#v;`32X;Q_p03FFZ)vWte*v+7=J~!WAR40f;Fy@H125=sBTafOnTBtUZOZ0 z`IE*46l9H9?pddJmIDK+!lz$$Z{h<|dmUfFI^huM0yQ0z{2WEdEQO|pc(&AfdOctL zJposGPlmTuHId3zOP85;eMgtFnje~Or~N|Qe9^Zt$}a!POur#`b30F4N4Y)ekxr%K z^^t)_yG57p?u$cifL(oISLY|;N|r`$ErF#!!}^R7SogY*pIRq-&^fc31v8;sMM|b| z=h8%t>pW1*2Y5r)A1)Y^^aPdNW0Y6tlwiBYmsg@}YbVF;IS88F{%#h@jcQn=}B49u+ zYnPVy5R4ZTLj{~A?0R(oY0S5%z;y6L9veN6>h zM8}h0b9|fkquqqvRxAKcY}~I;j`XZp!hX$s3Vy^ZM*hNK=%i;JV1j3T12k^K>O<00 zVr64qM^x>M-$ETb<|acQJE#p;khHWbzuXU41fWV8Gh194R3(W7ob+U$;|Qr;$~-_a z4%#ZkfpV?D+BYz6>Mm#zpq4~)o3kGbm#q4#Y$235AB$u$rIX=FVjTkEnG(pFhB~gu zPEja%el@2e!Lt>P8h>VQJD&SBlTVRV#7s1++J&m?;^n^7BZvXP1n~AE8yb;}?!eM; zOACLud=wK&l|HNjc28IQ+nROAj+f`mlxiJ%C2~6pqvtJ)IMe0c0=l8!g5a26|11pW zuKF!It)IhL%V>^K_%gts2{@Dqm{c=}(?Y`Io&ZUzW+Y zCtp?<)bQ*D2W&yB);t&z&U;ysXwx)))&vt%L9|Z8!-I1e7uodU2Lu&S?l%-7+|4*j zE~Q$(`;nM^bUoBDRY#s^8)WA=i-PqZJkt+v8n*b=H!`zfgiYy5hsRb=Jnhkp*-cOQ zZh~A=qdDUdpOpdS5#yXR>!i`_pj(;XP$=MMpSNM&*Ja*Tb3E@%nq0i@1-P9huN|!5 zD2(YBCh!T8y}C2*XCQ$0UXAyId4X2yL=xxjZf2tT*x;7|>2Q0Vutkt@7=1O{;D~V< zdBGW^B%WI7HjHNSmR{B))z!Sq5GIRDZBJc+8TnvrDS5Fya~V=KEXKNlma#A0C1b-8 zhftLz4Amm`Qqop!{!WE03=$m@Y8{Y~0|f@rAtEF}(U7)aBSH@I{2SxJ%x@kEA2UW- z2G&2e@a(Bw&3M)7?3U|=w4jS{YPJwv@y340z64#@f~)oR^V{_0citgCQaq9OzoM0J zgE7X1>^tx6k?ovd79rW~DJ5cym|-5EDejsmwWfy!M`YqH)-T+H=Z*O;Nu9QRh>T4y zUATW8YZljv7u;WNagQpaS|m+Fb!A2}8`eN}nW0)d>eAo~R@z?21uEkPL5v^Ji@d=g zQ_1xb9!Zp{nb{^FF9 zNwiQKCgjxS6h)bPe@X)V*duGqcHC!*RcLSq#vlMBCl51#~$1FNGrw; zHcCd*Z@wo~rleEw^~6x6sNqk&r*u!+NmS|-mA&IUDq|y;`;tghAvg-6O%umB@i|90 z2wha2e|tgaP8qC+T-FD`HkKOD$N)g=r+MrQVa!M2+%t_#H}!m8cxY(_@HK0mT|2b; z9Aub{Fgp7(*A9YV)(gkFRrXBjTbUJ`A$f!j1UV6e?G~STQ?Bo9XGYsN{o-r%qjH8c zsNV%K%zEy|avZeQWDD0C5^RW!JIGZRJ&2oc7`H~CI@6H3fs0BuMB%~9dvP(H_%8-8 z&7A$YBF3*@V^aSKxcQ&Lvi}cR?Y{vxGA7REcE;jA^Lo}M#Q(MZLt*w`fSe{(4QDJf zl)t3&=A!e930ItDDkUgoiR+LN=gc7II>{z#F_xLpm-$JoI8sDjh#te@L?yJdir};L zNj?-N5Fv=W2x-=~!R zyxP$Ha7@5ZQi!C)on*mW3I_5=SeXJe(O|XIdxgP2CY(kh!$#3N6T3dp+jxTDaSf|T zmA3%JImYKf(mvs3O42^;(Q&&4le|N_XYc`W46m)xa1GZXB@dr+0nA{bwcpvKVSKlW^ zn>8Cys&~3m)G028OvPntiY8T>OBH~E*B-Ve5!av%#kOR}s@6W$s?^oQmdy&Rm&t=Z z>-8!1ljT+Eu5JZw*DhB80Br8tOWKU75>;XavL#CC#;W{-T%*#*^J2q^WsUx)qUlCu zWfClI#-z!aoP_x7Jc(SaITB_g;W^?fXW)N2bkD`SyY9%1kzE#8B|~))@Qs1Pg;S!0 z@lbvU$D|ER7An27L0S`>wUxts@J_cfR+=kSX2%;ehxE;I#CpnT&b?pkw#g3!2AD4m0N890 zrAeI{-BKQ}K!Pk0m18`V8mv(2NuFEPHY$GypS1E!GIR--{pcsfY}}0H6bnasHpw%j zSPw8FMah0bu*K9pMP0|JHfu&N51E1iDt-smw(>A)Mbk9S(pLyn6w;o72vI@BSIr08 zZg`6HuK;s9R55ZA#iN_Oep4A1E*k6cJ5DfgSd`0VG+G|Ja4pbpcjxG0+K-jSb`Z&O z!?ba$lY3Q3f-QO`!hB`0T19DTx(|F3m#b7DKRN`N6*nnd{qjtBg(0Hkymv7aK>x4yPnrz7W7V7|0HWxkeC@J07a%%%hNB#;sUHjJ!#TyO^ z^4*~&5G@_k@ccs>hW-iB7k@7dQujDffR|%%SJxQ%G`DJ*!6=8mD)AUAcFn5iz*418 zL$-bhYL-5=3du8?Rmpm7mb>{JHZYJl6UTslTp!&H>a>ya0mACKRkv2|+zFzpJuOX> zayGxp@$xa*Vr>-(aT-Eg`$S5DU5=;wh=pJekS3Bw7Sd*2aE%dSXLVs?_Et$2rqtrb zQhQ^XFCbuwmlA72(36W*>xEmjN;KJvxnZ01F<~|(#W_*b;k#I`lFecyfYgKT*lKK| z`3RTgMC)7E#TpeLga%7xY1z7f|6{O}^G34_#X2e<4s+=&vQD~ze-{QF@COg~?w$Y~oQM1B01+0-e~+AWboFw)~(<-G)^!Bm<`A@KSTw*jz(gUFkU_F#VR6%p|}*l&?hvx}7VQcQTi2>(~A z;32&NmCqO>7SVR^3Qmmfgo2u!B0P?fVd%F%BHK}K+}TddnxBk;fH^}nYVhNF0_=Ve zk{d8q<`FdpADD!xv+qd1EsQYEu-DZh+UATn)7JJFxYFAsdQF@?$>x@vT0Odu!Ad9L z{i1STG24fB40>L@9wYqtdtSw$qx|}VU(K*lzXLm8)wqfOR^=IE#_kJ*Wfm#6L1g6v zw;C7Jr#Sf^Q0%Y{cc(A-=; z{Y#^3v*C(Vr>kF5EKq)i0o+Z$rNn%Ylqt?JlF_g`?EMmbu;$K@q?=n^P8SCK;{g|EQSgs25a!+EnN7 zL2aE+%|`WNmrp&=>!79~FCOdH(+cRqoqMe+B!k%0SrmDI2zf z7Y?k$dwvU67+$iocMHL>>$bXq^BgPQdvouF-AzX*LEE#k2PbMgcho`Dhqn+BcPupZ zVNt%=DIQmST-K_<`-&a4)xZlV-IKoMz?=8-TiPt>y2S2G@G|A@No}tzT*ZG z=nkxB@=5oPfkb-@S|F_-`vu_t$kY=3|3}66Z!h})`$OV?N~{(s{!_Z4OUZm?UR4tq z1SMI~@+lANPqe@%cuXCnWa*txyB9^!1a*40&8gl)AKq>pV~!5i6&Uy_X(pH3G|x*` zms`*G>w8Rij{HELN*FGj|I*@@mMH)S~~EG%$V+5wNhuOQ|o;@1xVSj)IQYU^l?&Zr$UrNQ$$ z&0%@p7WR%2Gnl#%l$h5I(3<1;XpQxFRu!>t4Ux)hyDOSus+uV0qj{9Z>vOEr%Y!*E zFsn9IYlSHo5AJORYwcSBN4A$AKy1yF@~*q@l$;66T*e38K_SaGjjYRXuH^^sUi11= zDN|_)F4Xoj!6lIl31(``*ot{6R}=WdjjD-#%s(snI!v$i%__yN=ox6&DVv@Zw?{!j zQDVKQx~O?7n8N(324?*o-`QMfwxXdbmbEel(JE1g{?5Vd=q&R7Fa@U^YW=-t3f%KO zPRaE&5C0`{$A|Vno8yxM&FT;sVqE^-*bHQ9miqo;6f&IcZadN(lt0Ch-07F`>AJB% z|K!3ZGZS1c|ByxQuUugKM8Jn|sBocLVYYbWp+EN~=oP!wkX{dsqDP)Ns0gX>H;OUW z0=m1-d}@Wsiw9Q{LtK3SWWR(Jmuld#tB9P z2}&T_R*_8Pq&uart@Wt&eE)iltnZKR=MrR){rzz1$hB-CsjgY}=PU)*$VRUJYZ!y= zYxtyE8LU}=96KGU!sj@x_8xh=p)@m3cyq4Aft#;WaQl59Rk`2wFK5fm3aO?`!n*u6Cl^-xe!`x3yJNZjf_Z@P%yX+A4$EdHhB|WH;8@1mn=4w{ zv&`oqN#|9`+RDw~NL6A|Op9~c_&%hw&T?CQX;sy6dWq+`M53|423gAIl6*`%(JzfV zZTzUYh_0rp=2*I4`vzHOYJw6MS&r&ydK(!Pys59i8B4W&EV)k-?=apI4E+WGF%XN~ zpx%!J5)Y!{+r2P&>N|sf4~f9Lc(5zlYa?0frB&=7;tziR6n{uCXO4s4P4P4YRB9SEG0R2Eti$)(M(ur`{_}K*`379pkE#GTAVpp#B z{KWE)iwOxWO{nB2Prm;nM@;DdHc$RFK@`URp`7k>#F#zUI^rV|SQ-YMvw4e;z<{WL z-1#!eygs&y#K_b4nE}Sv8;5AM87_d(1gF!fxm|H|clH;cmox>06r>o~6#Pxe#4dkV zJp*4EnrgVzlq1QZ(y(9Oj2ShJgnfy;oD4?RhFG`s%S~Nft7h3)sy&Z+7dd!=6bno%;Nn{)mQzQ95^ourbvIf<2|mLL9P>QuJEzxKhZtVL1v+-{8C zAYmw}B?(sRNBMh6+dK2 z;3_`atlE30j~&}1EzdCiQ-Sx=xOkD+yI%zc&#-kkX4>H#vr)dGSf4M3m_C;X*yHRP zhYVqTOVpxkv2`TV_F3FY{t}|Pr=Y7JqAYjN|A=%#tP;BYPo(|+W2FC2n#%urg8o06 z%ItUzDIf;q5IJp3t&8p&IK`;<**-D{f%wQ$^2kU!-lFWNnAr5+W5_2zOk%iOu?RP1 zOA3_K0D`u*lL?MCx*EBeU(0pm473a+@ePNDR@J{bA*gGzHp@cq0ZnYX8pd%{ww^5~ z6gcD+8foIY7F$FaMkdGY(z2U$hCwgJ%fTFtUn*51`0J3o7W(X;)cWC4H%-ttC~;2x z7h2u27ko}og4V`YbZvWp@<)ZyqPC1eibvQPZ~y7 zK%_u!%b4Deb`^YGot|R-BjC)KKpLJu0oVPH0cZK&KidCtn3uFXyp@-pzH`RBJQCBz zzzq~o84Ug7L&D{A;Zx#)!-Io=!yB9ZmLA3m_-BBlD|{rdbnx;5iD^HYU|T@&T1h4@oM z0QH@+??llZzt5-WeKx2DY>U8wK$sb%MPX4Gf4)noLL@`f0d)2{DQlsfCE zYj{Q?31Ai|G%p@tkLKO=tH+AA!5%7gJ3}&OobnT7lZumaIE2f(8N$e7lkr*uP|^ z1$2d6ry%AIzG{>xn1Wpwtm+?AjhUW1)sC57IQ5R9#XpVO$|Lm~5KOJm3^ za@Xn0dTdT3K*=xe6OFZfp?GgR)!7|;^{@vDEX=W`&gX!Mq;dcw_hmlaedskl%@$TB;T{~MV7Pyk5bfOf3XMrP`8>^GcLUNqe+}psL(%a2*ddMR^&+rI)S3RP=PC>C0d)1aE*; z|80?h-sr+*^%F2p=hzVMAHKuiA_6hAgytr^&#X_KZ%T+sYG}{ySddW{7h8S!H$LRM zFP>WgB-^*3adaDjhM%r}Mj<;(_>oi-XOkDfzN;nM*ls~4qzljY#Er3VPs%k%GfWvs zv=pu$Qw%LdQ#<17*b`#CTc;-VA*92971$`?MV(_(Ynd@rfK2eU@$SLiMbWI8Bs)>I@Lc2+1O#?5-xwXhZr=CF9s#$o_<4_&J#29f3j7hzmvHDO$LK4U@r zB+RwE%>Era57}I+XF>wBzH}YL*`=)bdm6!6bS-5DvBhQ;^Y5J3ub4uf{@(etNi+DD zRAOR2kFLbY@hD)Uu=x5epnXS*YcQDg2V#7r1HA1B8Y{_Z@kFXsV^Ty44y5rlY@loX zRV>1I=S{OP9bHpb)L70fR`3^{DeMRm>4;C+_Rg=P;nB>o?qpzo0|52f_xLBTui&BPgwkBPy%K z2bS6eMjef=yP7ey3ulgoFb7?TRH8=9#i;2SO=yls+6E!7#LT4*Ei^ zYgbUoHVF$>t0xdTrRhNh^)%j8VVf`-#~?{2rk5JNLWxZE&h4SiQguQjBkn;Q#a1rb zk{jR$?Y~%XG=YOeSI!=3+I35?PDQi3X{v5!-CVT&?amt$T^TsFX{$1w+tXbUAV1t8 zo!djYOAc(?RZ4CSJYszDvp1YOWm_&<;n5;wJzin^7j@SipS}Hhr9ms5;&J(M7i`yw z##@!1Z$V>xh0|8zCU^o}>QJcRq|p&D-RjucrPb}Jf3S0*eS)#jki|F=Coh+G2;GG< zTZ-!h8NbBqrBa!aFXum^V9uQ4Va%2*XY||4cfW8K&U`uhyXyu?N+_w!K|OP-uBmzP zHDdnqqtX?0Ve;^&Eu361^DM%xvQ7_nNQ^Wl7`+dm6cm~;Oye>nLRV{u}(lVu<@! z+K)i`a>Ip?>=7uNx3I_Zku94yU(NYl9XmAO@rIMPH*8-w?M2S`8n5+t*MfFj9FIYP z)Nj+%M~dxTZTn&9?t{1|6y*ZH$nw8M2d0~XX>;FX^8J-Yp3%ffxN#%Wupme^7|&fi zM%Q7Nb6h$FGwjW$A4Z^HWg}VUk0-gLhND+L;Uef;UsCXTWdZc5o>Hx`a&jZp(bpNl zD2{_Xt`nK6FYx!+mk=pfn-Qc+Iy5x4cwX6oSB3uQn&F(r^kJI%e)htYL8KiQx&FME4gYc~j_k*)^5WG>Z%)^%us9~rd zB&eKCW|P=7X8Z~7^~%KHngGs2?4o2Rg?9yMql#+ix3 ziP-kjV-$SDx8Csx*ehN-^-VwBnTU_m!<_-dMB*&n*xB7%AzFll92bHF{_xBFebiT} zA~txdW=C!vr9?RwbIC&~cGSYh^&U8x%ggYX_{ifc=2#T%=O6Crp$$dRN}6=9KgW4nTz~6w5c6iC-)f?xy`*(5qTv!HwC;W!Bv4sHB=d z+Ob9}%GC~`l(TJx>-1*y@cA3=eZUNbaJHi7Pq|o~M5Oflp-< zPi4ETwj_q0pwLTa*0fJjMpje9qBPnr$ArnGZ(69>i6Azj3N$jkssDLn?4ghBqJ8YJ zR)nH45p4P#>Y4h_bw!LMy5nDB=bU@!{;Kht`24N^gI%|9&%Kmqk7HmjTff6#{1P}% zY)aAL*$~FkxVl6LzlIQQ4Mo_&wjHl@qk?T_`6IG1LZ&x1f55R1)JHAFubiWttH43B zRfOgWhew@iKr*nuY2L;{YqyatmYzqdRy*HCLd=)PP#!Hz*g1^UxNXWfPGwbrIyO^g zIi502M@zvZ*JdGQNcdl1M=fHtVdaEHKid${F0$OPCK#0-3>- zDN%IvnmCl%B;Zg!TV2rhps=T_7G+olL?Lr#_Ep{-9zC0vDq>tCqXSzEGHLvwRI07h zY8I?khRn%owh9kJ{yDhX6zw0YpxfWHe|&%pTDDRU>uE=0$9K6kB3yW1Lq*H$?Z4 zjSY~%GxvJQJutvpyW!C=o`zZnOX-G=w9UrBfC{=HH=^GywT%`xs{X=iPqbDaG{fxl zgV*8P#sw4FEpfXNy|_AMkGrT|6Uf_c1FSkez~Pg$?EXsH+#3fdZ5vnu67Nb~Dcs%A zjtvDRr^+R#N+_-rY_G=*N@hW?t{fU0=kyL+nPhd??^uOEr`b!6PO-OQ((Jd3oI{L7 zDInplSRJz2((DQHP@|!+HSF4q)T~&FBEq$VY%}Mecmg?Y=<`K03vyw9Kf>9){`&(tXWAT*>e=?lLK#I4)rj}V)0G= zm)V9!2*YVtN=4Z=%_Hlxp$;Hn4BP13fmtY~et|Gyy~V%LP`p6rH7=v}{cAS)HB2Stx48_73nRoXB&lC5f`)?zo3a8_%yqr%*!m6NT?2NaVVeJ5!Ip~`Dh zwOFl1Fns%~kW~-2T1VDn$~MtRF2v${0yQYjM+OI{R#6%-IJJhlhD|r8`qP(t=pzf{ z?Xyhx#3T9~ys%@xTIq&eCli1WHaN`n`K%pUBWR?SrO`r8nvD=|ew2$A65mugqbWq+ zSTNEonM)*`+L86h2G87sv&fEYdF@{G!|UOQlDsrlY|@5}6t0U8e6bmby??=JA}-fc zJFYWwHYSaHti@tPDDs-`VwhGpF_TnSA~h@2lXlnDdy9d67*}-Bvg~z#0|D z7%?9+*dX~5>}0@ zEsXM^atHizZ7$%*&uhCPmu)OiJFwoB_?(=*M{*zU->Y-wocV2n>!gdgb*5NA-B4&b z@=2WefogZX(b;x$d)ysmeZ+HkubyO$n={M=x@Oj4HnD_0lD-qS1RX97qL;vlrr3;iWEf~)0`KXiO2JOnjw)Ik3bnFkwpI>1jMqdZSSM{NR+>KVA9xfO)c zMp+^TJQ@B~fw0RbY(4^5LJTM;3;D^pEe=>o42VVo;>$!~!h+CBO>wK`-tq9p?gT<4 z&J&Ch!A^NFEe00rM!4zMTX7WF-VH+~Q=!RnM>_zm-#fY~vApB{h9nAuv_XcvwywId zYE;b-My;2Y-~?|)W&D?Z+2Orc?b_3D-tnbfJVoso1s(p9GWF)|e5x}V0vbVJs^F5l zAV1n*BA^|c<6JVUx>_K;9ad`T>9&H_TIIq%N7F7meF*Z-Y4Cy8s}Gr4gkgIC4~C&S zF8nW9r(J|^h{=+ZOxr~yqb%+kF{(ZM(*+mjxWErn*76d1VmRUZJwL(gfG6ZUKxZpF z?_9&Xzmr@!lR@igC@a1VmCm($?r(GtI_fO|Z{zfOqPEmxD=(WJo3e@BcERX62+Pk- zG|C9;%lmyLT1TI1N59&Nlo)d39rOaj#h|)6!KQ9q&rp@u@73MMH)A=DOHQFsO;$gg z3!3-8SbGQV%GP#Uw5sByVkZ^b_Ka=Yw(W{-yJFk6lbMQ>if!9B>)ZRbbMHEPul60Z zHd~uNVD$04@90lQ8G)Gv#?djUQHiFSzska+ij?vcf2jwp#oSFz^e`v$BtQiC?D0Au zY7uOJxRJnxd9$(mE8GkZ)8eD0f7=WzpbXHo!HA~#g4@c?wYn@5$tcQpE>P6)$8G_q z#?<41Z_;W%2{Wju_0l0npEk`0Stm}s|2a_|@ui%)=Cu0Pul{!v@_hCJnY2cT=#EG) zoo;|_%Zy(n&Gn#K#I1AFi2Dx;zD`J)JA;K;lGH*SAZOdRq~oMhtLi=pXY7SCRl`mX zSfFb24xuvyt!j0@%bmxmf^84Yaa7#lr5Dg0x0x~UEm>sIAkDb_L_Vt9(ZtZu^9h2d z(dvOz@S`V~n|#d5e0cc`65yZwhLMJOdI`}7H@lXkCT-B0C`WK)Irj>Tr0}fRYYSHxi)dQ#|VhH;dds3=(At{~z zDU!ZJvMMT0WcCP7{#{?nS-HL72zV!4Lh&!W{{_{;o(dSxpLFgm~3iBTyNpu4B9J6KH^i64}oxxhLl zx~5~+9IC$Y*)2b70s3b>YL+UV(xkG4bzuOXh7)1`fCnk1r&RkTq6N}u- zP@oLwB(a~me@o3)y$VmRomFJrWVN!;5(mqe`}{zu#pz2JIv0*vid$Fo@yz^r(w#zc zzpdKqbC}>AixGlj_7k%JN0in=5h737b(+INZVpgaFS}-KEx$9$KvKaf&3>nnGvGcY z4!8wHjnMSI9Nj~xzaz^5wT?FlInK*v1Qm!|P+pu8%TJfzg+dVVEeGV4r_YmFAQ61ZL`$q=( ze{Pok2OZjfu_YMP@bp4ibbbc{CF;|0pa}S&1@t1pDjFcK7#Z;C1;hmKp}e4}NP zw>SXRmpgTl=ti$W{$Gkf9wp`9lia){06dj^L#6{2Q{dBK=z}{XLAoCrz2lGAn7-wD z4DT|ZE4D~glvj{0e4Q@xopET3E9I+e7EE2$njar111XnL_&S4Z!e^TNuT1YGp|(3* zjPJ_)++AcMADWn5F?gU?Snt}szMCO=XS~8^-2;q1#5%szxV&*!ieQtE7him6OMFN} zKYHo>A4z;jaJ!SQJP9MH zhCUY2mbL95(s-yzVr;LO-)0zs(>1iRH!__ZYcbn6A;@Z7;GKebYMwEagQNDDi>3Ep^h?_F6Z z{eDms62wMd#cRpF;#Z;D5ey7HJR=Dj;GH_sf`4qHwDFRad%d4;IzOXZvkr@+}nNgxkh z8k!y(RrbVi!Sxld9B8DSInx!k ziOkhkZPZxo`OYZ-_TdL7Y?VX>YfP``@WrS&72zqhJrhBjAofaZ@U4vd(z#x9?gRHh z-)B-%SVImVc8%uzMX(fwVg?CZ4Hj%kBbQ1rk{c{Mg?NbWUCn#(izOpjb~vaegC>md zNkpvFc%^^Q_T?Ee83iDE_a&NB9Hs|~dN zRXVW@v=s3DS6WMNvO(RY72f>H_R>6qd9t^%#9j@iuI=v^p5b)<2nR=5oS zG7`1P4D#PH(3Gi~vsB6>3ThQKYAFOrMFm#g-1a|5yY+Q_Vdv3`Tfr{~0t2*5D$3`I z7CBS0Onc<^vW?G8AhtXT(o0qkkJ_Q_HbVMigZ6SkW~mbWn#>xdzPCWjV=a3`uue9Q zkXYR5r?f6)8*>VfSTSpt;!?8c6*c-J-cq|HNG(~=&yz{zfE{?LO?lpjnP#J8&PJ+a zfhu)hGAH7xyc)nn*{B#Ik<}nO*x8~Bz{R&pt){3!6^RNZh@Ny(7BkK%ij{g%=Hy#r zyepZLgit>2?+?5i%)+L`H3BhF^huBkQNsE~MA?ZMGsav}=ZLF#WYQ*FxZ@;HsA(=% z6iR=npX7ukZ=QG;6|*Cc8nXkHG-Q`-*PrCW5cK`}=aqX3nTqDXFwLEFv26n>9%>H?Z6Mt3`CD$e8X2m4XE*S)2VC1I{K(t?}x?K9+Wg-n)% zAsHag_4>*_ko_RetTL`>Jdx8nw+EwoBPeHqt)VZMnt9olyh=c<{jh}&m^RCy_TB0Dpg%p$PTzDYBx@j z5!tYjCGd}4MrbY~86vf;17GN|3BZJ^z-PZE_U26oFNdD&j6#_p=IhsFtEcZ9Py#yk z#_}U4^`62u87&UiL*^=*RlvB}y@m*>wwk0AV4734&z}ZHMH%HchLb|tIabXEtJGof z8QVzN(Ay?vZTUZKnlCT1r`8v?2^3>w{k@2mNd^!cvKdovJ;4rHC3m#n?GJPf2O2N1Svt+V-=(aaNrAvnL%2 z)_dP-JMKS_@%vceV^TTB4o)cd-`}b>i%VO(*xdZVaf;8`6a`%n8dIjn<*V>n3rW74 zCYwPyemJx&pXg=XsAdd3ky!-NsMeu-`B_<8TAEH-a4m7!9qPHda+$X7xD|b8L7@`c zy*3_a&iyT}G102Ne(mvT=>wo*16N6nx9J-vjECTgEcwRbnt5n!y}LTTbS7OWy5|`g zh$e_`LwP#7c(9L8d!1>D%k~jrDjr$ix&+x2yV^1KU}@(}n+4Cepv{VarMQMwTZSd# z{(9Km-FZt8SHw#>>TJTfBl!#x?=y;LbCb)EH5sco&wHS7BJ0dyqh4tz!;Lw{vONFZ z{`DYMe9b(KfP}kjX3Z%^0I$H)p2ngEFA(H1UuAXjt5R4sxXN`a4L|nLGRC0Dx9|IJ!2EP@35JxiiXYWMv5LvBjCPn`1Id_v zNVp5hl{M@_58xYpC+M>scGL)dnoQ0$97r>@Qx9Ho%QYIsKDdK)=K|&zTz!+k>kF5R zg`gv#cSAH*9s>hyRqy)G^N&KF?oocv1i84+(Q$R*T(acrQ%$SFfuOo1VpRr#@F}LTqexT4C-n@0T zATxXk7jo1^J>=k5+t+L7$ekE)CDSo(tmrb{&cu3$3-bmSq90=@x~T4vI>ZuaUa@P( z8)Yf%oaCk@dMS55Nt?U4)!8yj=!3ql+VbeZ?{$Z=uxl8(i{Q)4v#FP9PtW>7Ht-sEMT|ML#xx($fmax^hvZZ`hLNiW&+IuL2uHhU! z-HBZV%FTtVl##6o&xtAY$<5?WZ{}0CzWer7X0p)` zz-Ly#2S1<6S3|W!=3<^ZKEHgU?nlrif!9*6naffVGY^RF`>v>Vf@CJS)T6amfn9w% z1SVfwDC`r))GmUUAt1CKZb*G-^DqX4kWkhn6!%F{ZIIgtW0jU{OJrr| zR*`u}To1wRNb6!ZYL!*XPi)W!Cn|_}>L80E*rS9WTsi$3NA6bfv^yS0K@(eb$pO#e z3t{XgaO}G%(I)U)uGF2cw74#2JU}snxv-lhlbaRV3X2f>LIE=Ln&QIibYsINg(njS%kjG5 zSkE6mAYYG^=fpOg>~)X7K-3__)S7_i4_^i52eoGr8)+Io8j@e}qWOGffzK84p!ULK z;TBlnlw8-rTUkNsHOv|;e4{q{;E<87L$PpIj_vAC&<&vWPMJ-*$W?geNfzU^E2LRr zEL#oc-6`oQMLT{P=mNV(8}Z*zOeO@Hc5IQH?|Ki%CQvB_FLkuPaWTI%-etwnC(z z;ws9{GWr`RZM69}=G1N$h*`;I;p^^3h@GB@YYf78sd+EiMUNaxxN#MXb^~-{i@HX? zDT{s!6)Ee;5`KtjrtQ8EJUm>k;AECNIV}9qEHg;7pl>RQ#JTzMUeXY`w(s}|pldh0`BoTsK+c`YSU)4ewb=?MOLD0Un|qHU3J**IOY-K!O3-ZN7`&-?R=6eaE|SL zg({Tq+@4?702g_M>!lxHe|Uz@?|CbOI{iLF~e>xrM2B<8>j~`LI7=!$b$_3g>lJ~X5MIg3N_1Zpfec& zzbP2Tf@K)$pDw64_xz?U-QB^%4YJfz*3;4x*+Wf$r;R7RGhAkqpDL%p)qaBu_>A6< z(rm1qVe{N;`t5!u^Xw8s@0ey*e!iE)ScWzRQb}~8j%rRsFMG(#FhBQ@W|!9(2`@N> zVGh}Ds-e-mP*ax-%HJYMb_1w(pB8%xd=Ma&TpUR2U(BKn#BDb2T`tAeO z$HyXJpo?2BhXhTr6FaXVyCR`M^Qo~!x4$hh;#+!Zo-mqE0dCVz! z;4Z)>JN=L{Q&p)bd+{KTuui=>S%CB-@xPJpdw8KF-2F4=W}SsiXypQeu10F*`r;E< zN$W~kBS8M4&d~ct7FzTC;`AxG+?pNlE+G>f`4z(*(y1Q}Uqe&FYZ1F;1ovdZINX#r zVsD!)c(O`CAM&n{?0G=n=khHgb;79C;G3e%dlu7~5ku+>{TzqIDePZRXzE?Ji~eL% zrv8yh(fs!)v;PVTLgo&}hED%qGr(WC_^UKn(%i=AZ;HK2`SH(kJ``^BzEnQ^g2Ijs zp%N=bi=a7(@^DB*TxddnFfP-fpVOQChVX>l3t*q>>@p9szz|9V1bw=ym@`M<-BnI^ zx9u0N-nt$LKXLz-c=@tpvcTG@#+~^!M|YApv2?}mb%3g$CYcm&!O#(mb3vtz$Z-lo zZGz135VREXvt?7<)=#+-%>4K$F^zKSt%E9gplws8MUno}wPG>RnTAivS)o&Jn#8Mh zQ~7%TbrwoH9P>6a)LcK0RJjp1^n~5bi?~;%ve@I5NjY3n*7F}kgg|THF?c4W)yILZZp5k2Jb}`o`*;|vc z$=sR&eqeArep0D!(Lg^ZP)MQ=-+~^(Ezf2=fyV{op1@AmNin^!nr92~J`J{e(2uAK z66#K?T|`Lk5%4|8&Jl)lL#5p{z@q+;@Hj;0q3I(k?i5965&&8&q{V08hlr!Q*Y

    zDqooDj!t$MiIg3Vo(??tN?kz5O5Bg9fAvMn@+;dXf8ylzA914ie;X%%$A{vI3<^I2 zcToN8IhejOO2@a)Nc9?IWF$d1Mk`42Q2T(3P9|7ppo^`C$L}{5yw@*0V{#znHhNGJ zUWZbPdrDb~EZ)~QFYsTg5upG`Zq%1To0tTrhdR89fkVj*W0j_iQ_3yOZtrqvWttsX>SGA{kSVrE>Sjr%&=~?4ty%nKaYOb-44X^pBt`SN@ z*l#%(z2VFF%2Lyge_-k{2PR8I8>`U!?bVr<6R%15Ok?mG^Z_4T@{#gxXhev(t2Hp; z54L+Cso2a3YDNU!vBZ~Nss-}4Y{@SDFZY9~2&i>r!x26VpJMq^HytB3v=9)E&1#%; zDmi`euG1#v4|<5twcw;2^q^-`KoozNMGG>wDvngCmf-g&D*01-ehaPfqb#25qcow9 zfsmYMQfXf98h=7=ajl(OrTA;ofPjlYw0t6n>K~0Ca{mVi`i~&k|2Km8zdC-DK0QaD zt-k@*DKiHA6>7o=6+s3wQDI?t07NVz&>*!Pn5!+92L;;Yb!!*fus2JdN03+fA@%1; z8^T+CCN4)4U|O1|>&NTc9d?gpN8RN_Uvdz7V5YARenWK<5uh(7Ye&+a#7g!s*?XoV zF?u;8lv(PRlOzUEJUc}876Pz)x z8!Vw(7waFkqKMrtXQtGwp1Yu=@i|}kBOV&F>|*Bw6}N@qF}p7nAd?FE9#KQe;9HzOPSOc`=gG=yXu8A&%LNkO!-K-ce^)uEyr`RJ{%P(C&ec zdQ-?i4xjU@Zptjef>;yYejUHFZ!0g6Xae94r-_QEu!NGQF`0W;Cm==Yy@D=;>8luO z`oBU&?SGB*P~r~zDT7Oh^Mzpp9n4Zz8s&z(NFo3$!c8YjLn4&pm?v)8qq^|TX`|av z2UA-|(q)bR3M?qrAf<;y@=!%7ga8 z)F52uVk0AU05Gvo2l+~_!cvaTzX&$fe>NE#ex$>{e(_DbvI2uK&YuaHTy}ivy2wm> zy1ID*`-!fG?nYiieVIxhpNSC7_Aq5E3SP@x+{=HX6?8tSO9Y!@;i!S|=}8k&1B^w^ z(%dO)u0_sk8X}Qp$wZ>MNnmW$N3Fs`C2<=nwP8zICXsZkvyFjGRw+(Whqv+XJ5^}2 zg*I4AqGy*fKaM!v@mBeQ4OW!1slyvnYL1oOg1<5Ovr8q|Y6u6ax)!xt88_8NM=}YQ z?AvxH<=n4Y)_Ocg_0f@5qte4g5qHz=NH}rx5p4cbdtFVlziEUZu9vj= zR%K-WrXg_W!lG|tN8EQ$uK>CLNf**78kj|J5%^Pf>DhKLa5GxStN$bF9Pu&ghHZ?_ zw?K$oKhis<)4U1Us+gV2nuB2!s1VjUJ|gwunyk2aPPxw>>neMnpbSpuc*r3L1L%De z!9;C(SfbSfizsANrQVEFJ%Uod9&5=N?+xHDdHUBj5)8ow?f2)vEBMEOC;5MhslOIi z|K+S3|FpWHaHoK0@Ie>wQ3Ub)WadM!rBpt)ROY9Wm-iE!hyCnA@Z$$AVZ|W6v!HqL z@s=I4fR6NANTMy=d1pITnZBMp43hk0TXMRZ8-zipgEExQxYT#NP|Ad&LwR0WvCWd$ z@ZrRQvxW_Ulng0tDkJhO6KWKAQvWm%mJ?>Rs1Zq>l1{EZKqYBc7B0gH$BzVF+RI9w zG%`|Ynj;wLSSXiR?SoN<1>MOOTy-(50xLD!F$YU5-%23*LZcgIZhNbdS3!`os4#1W zJo}wBF|A*v0!xW2cAv3Z--D+hRm@geX6lI&wDjhHx{=}5Mv!;wm8_NW&n<322_k>y z4)N5fA==)X9*-VX8W;$PtWccMyhOmQL`tvrR8blASW-H@iO8x+E6^a{XwSq^c8RO! zeJIvVFB&uyowwx{Jd)cs&U1FQQF~jf3=Le90+)L=;9$cEI&gx5BRIF-N)BQ!Z3aI5 zKLIs&8<9}!+Ge!dWJOEr6PE39%h{^u z72AkhU|GsCK>e^TPCt{AZGA%QH-<_5L}e?2{cLV#%rK@R;gvyqO$L zeBPhmL3(Jjp;uAKAyJ@?kk`&z!eh%lv!U;`F@q_IjVw7&#SC-G_%?Y6Hq7P;Wt$p1 zFFbSOvP(;Uqmd)Bauk3VXAl|7cpr4${!rBx8V_s~v7Gt%S;Khg8_DT?A=syoKTk#A zVu#3C@i1UTORvibNH~~rD14Z=V4hN|(Ri0y;ym{dX`Uy;IW8){2TZZem{lokGU(e6 zTps^c9I_A*VQG&>R@ctgwk90MY_hl0tF}=`OWz<5s))qvoG(yf6Ds$0$|x{^xG$)bN|Iedg4KBx>H_In znz8eVuBev)QHN|7GdsJ7c1w81a?4q&<0FRWEGSapm)cIxoAjNy^%Zcnj7MuZ<4Ql_!`6O6PB`xtZ#Iwo2s zTKXN~q9f=`O9mZ7ZV~qF7^ag%S->q3ElitxBg5#fU7+n>m$_vD<|D|@^YY>!&&z*P zY4M+*jj|?64(2ZA`c^9XR?dHqfyq+RwngGc;qD)%{cUZDC~x^@CcHOp^I{-HpcKG5 zjquVF{Mgo`R-D^zRMSAp1x$209;`ZEv@(r9@alGd zT^f{uwg*TN28&8A@#%>2i-z%+LyL}J^^be)EaCn!nR1Dq=)Y&U7?J4Tnz4!@wuNt7 zi(B6F8AkS|&>Bw6=V7DK(0PSXfu;#oTRU?Io)5Nr%;*)*@JwDimnUAc<8rAs_7pf9 z?oIWg^E%F>ka@PS?Qr;UKJVFd;TT^1qpKdkfI?Z#_Uoq8kp{Nl5Q>9QSMkJo@v87_ zL`y6=16WBv5JDjSoTp%+CKI8*q^`sx=%PWC72|xa+jdblUojWTDUnRDj3OFM1A%ML zGpcyVsM&@m^C5VZ-eixV z6%(NI6l6x95oI4}LJs7`Y?EBX^i6+pjAEu{e9^Xg}-HW?pK zwvqNQXAR|}10!Xhjz_3C_=LW6=sI0~c_Prr2$LehvM>EKtC&>ok}9aOiQ&2kQJa9B zi=PZu^bB!vJ=*a@K<1oO=4v1-*`zI^=HZ$sZ4G>lluOpOJ&OK7d~c*`$uR7njfHsM zf4S02e9D?MKk+OA{!jP6|Gt{^{}*iZKk)pYN3(;u-G5b0nye{{C66%t0b!pqu2HV+ zS<6P#_;cZIAp>8BPZM?;BGgv8zQ^CvE`=Hbxl4J4+5Aj!_P{6UzSP#+oHImN7@wjX zkXg^fb(4|ihtn6S`PS@mRA}eMU#d4v@>{{iWgR-x^VG1Vj>gn=Q=8HnU|IU~)~U}n zXXM2z>NKjPlXic`Ecd)8Sp!#03}ZaUG&)2HOtw}=>;Ke5SHOf4oe4ovp|La(UmM3c zc9$`UPo6qKrQN{{=&)6SwORgdc{aYxa#iGBL8ZpS6ExYP&k(7tT zP7@_azSHWT;#SDlTj!6Vf*PqGrN5y4nOeUT8>bZ8SL9FAVG^pn^<&(vAK?hI2jR?H z5M%p19L8GR<= zX@{{A73OT--=(jcI<;}X>oe5Rc-f z2TUL7--BgO9lr48K?E>^4^Z7Bf4zrU6vuUxVhEfDrxZ)i05xa{T9MwQT&7PK^bOtVQL_bT)F^PvHy{-7R=Qms`9N#vL5m%BRae1;_;#J@xxqv+%-8F z{^9E9IxoNwW)hTJnsu9(F!%Cm-exp*EFwlc&<&7FAjWgdY8kGv0%m~bo z24LFS&#PSMY%E<*Y);zR*UlSlT$>jbVBWGWUiNwX#7}Q-;T?dkK=+FacREvCosZq8 zlrLI@#h{J>U1rh`RVCG23$yj*q-b{#uhZHrs-7+$SOUFbbI6fEi-!kzP%kW@-wKQJ zD|J~JEMH}7s*5T;+o!O#U5xJ)#+R>Xkx@+h%xj=bvT;-dbM+LCB^m`t)H0g^^;mCl zUuEaoC(#!+5!e$p{EeUT%}>sjST-$hg*)^=_~!7SE$rf&D~x-M4F$07FK#`*Wo7e4 zmgSJA#&(ga@!-mbwGwQG385HbNq`Dd!1x#0Z)=@I*udNkkSxfFte8|mt9-T+lymoH z{|x&8@QdHK>7B7tFhBR-c3E*Mf*nLPQMKGZNLVk7$+<=GF6HaD@iFm&s>Y;@RQ)R6 zxQNPO*lm@QOLmm3q0f?WoxnRREq(Ctj)R03>CffsLDxYKy?Y9%PxoH|@YB6HB>!Uc zWrsyqWJFezO9(M4m6)Md-IUNC&C5m(p{NRWFR<}}Jf0!&jAv^km58YvZRr~0q#=-v zk$o_QW${0*)&GrQZ!d#|)%)7vtQV_2!I$)kMm@UO8(SsPJwx^ORabK4BrLcu+|ygS zc=D%f>E`w;ABz@nGXajSg&fBX9|ijGx@yNrCBJ$R8HQeL5vnMA>sK&Ul5pg#f1&$k zW@9hj+QRm7r)4J{67<0L&IKkcqiR#})M$ECexk;7Xf-a8sZ8VV!C@+h>erfbW~(xP zx^gQUJM+654J8c~Jwf&+iNsBGt&5~h1tq;b+rx|pTWSjSzb1t)vN~7TSgy`YH&%@f zv|Dtz&F1sOrKFCiE;h3^4NSB7a^8;Ch<`gD+P{;A#nE(_HpiyRTIEllD~ge@9#7v_ zX`2b&pc{45!9S`Ss# zBZ!kKvo$lzBT`I{zO$yGkv{pX>SQYd;@yg3Vy9CAHPo|{CRSzE8$KH*aQQ3;S7p$f z`c8ztdT1T?i9k>vI&U$x=u9?2SxsBNi#5HP*6`!Bw#Hwp?!ouXR%QR@RQ>|)<;}AI z79qVRN81trFw9 z1-E)M@Xbs8sbe_Iz$>VgH>{Zi<#g6A2IPUV4LJdu3WNau=Isp*@XJNvxot?ULNmz* zp0kF|u$&v~p2|yCRj7Ry<=W3Ot7yWV|BVD4%t){SCc8GBCGeWWeu2 z-(t2h-~i!*QuFU(^)jlc9mcJ%hWRj`0wA&&-ZZYwJt8Fy76I`4?G+iNZHjwWinO($ z3#>?-(aV%tMMki-2-8e8|BG64S$jR5Z64WQJgev@4`BJyZ0_DBU%jO4Y>M7gOAd2a z-&&BT{F}{8EXg&_Dc}!N%Cx3wAJPZL?*^1KZH8mpCO|-V<_RWcKPjYiw3nH~*dxSD zxq|GepHk#oQn7U8Bk1lY`2>bcOvkCW+HRP|bIYoX6SxPmvQ)mi1NiT$v}niDR(M#*nQEU|Ab?+;|Of)~LwZ$@_V zw?=Pdx`Qvux!%xk-E1xL9nQ%eYI-K2>7MFh7sL+zKdmRwuTh(SK5N3^GMk-vm1a5z zACD$CWn!Cu&{hbSkM;7>3Y0>#4PJ#}K@WF6ZFf|G%D;j5+BV~9>P^=;X4Gk zpNeevRM3Z9%7ykTS#DpK-%nBD4GL6PSPqgW+tU17Qcf}X-j!q4mq zi=Ws0hr@4)>}*_gd2V@P83GN{CG@DEfMBxB$w{PDso1da41-=+Ls|%pnN}=OpLRis z)Qy6_+wS)vHvjDiBw*i5jAokql{695ZYxk#7o>f7_r0h?LycB#15eQ&c2|^zHHE-mWqC zBp`Nk9)u+pqeN2@l9h?77q_`+bIk$^uql}kMPQ9(#9oS$Bpn0g+60GA#DutK3&+*j zR0hjj8rT)pzljP|hH2W=SUiv};NZ@(5FJlnO?d56^PyOK&P|y5!vNK0YQEiwE|EXH zJv7+ zfN{<_HY`KA({m)EOF!1O(U&ISTC!I%G7YB|t{w#_sk$34w01O_M?AXT{0Y8vOu~UE z(c#S+D>*1qD#){DU36FMN0Ki#pN>EEmUdy>vAPk`@MaU%c0j(PVS{GsrYWKGLTjJz z!%eYb1O51+N&Y56&ITmFej}}N%dTOnNaY2fDPdgjk(g+wEVM0+_BI8}!3VW#qnd$T zlgwPLA>4pUQG56a$D3OxJe3jXCby$ZsA@SBTZF^x;tGV^dKPAHE=ez+bbP&WuK|E$ z*BTg;qn(PoWL_)x&LyUrbnO)USYkWAkmC*uQCRb$;6)!_bS9hdvE>*yj2oMV$gILBP@55>+8MqCFSOlj_tIcTcFY0*oYs_ zVkeiqR8WMOhoT|IID7!*_6|SQM`h|~$kEQ0@Eu%64SRlOd7{1Gu573Mfpr;_-_EGh zzr9QxBa)@XO*6&57wSd#`9Ta85HTf~fMa-X_#^spB1xXp3OsA)xFD9)fCUF-*YdQ)TEJ-l$fdGwX4 zGE5kXyrdm@o*)gn9TTWJ#u}&FKsiHvI#<<}P84A?&IF!CznYn`tJ}^30GB;$4(5ZyNqfSjK@T z=rBr=3#piuB=w{y^$jvU-k>n)H*}W~!WKx4YP8b(gp>b*0Was zSStesQIrR;M7S&AH~@P#auZf_-ooD0&Rc2cq334Rx|e|xa~ zgS^dZ#%hZz!UG8#u9yvgKD3&Y?Vg0~9(LPuH0lk4etC6Cw~n{f=kg1w-5I{B$mPg1 zzgM{fWC$#*S4fU58E*_OcUW&#f?Ja%##GXG_$}fG9jw0c{>Oxrq?WdL6$7M?_waBx zJe$|_qUSF#SJ+z78#Bc`1rJ_z+i`E?ecwvn53F{BuBe}WSaA-}`hr9#e~R$neQ^h8)xHG%q?7`%7s zr#emWV)Vu^GU(Dn?{^Pw*z4v#=lYdhTDy$O^fW!eoA2;1nQZT6tq(ZL=aN2~!~nGY<4VODN3Fc24ymj93Ax!=En~Cr1Sw-0wj|**GpIfdPJL_Uvkof+E&Z>`{1QUa zoQ+^Mn%24PmxYDt&ZV6bIz>2rPOkcC-ujjO+M6zy(eEQdeHL4{?QKAm>>`wTwCsUb zT0{3nFy-?;P{*L73DhD6Q!HX(MDt*Ab>09!1(|8N4#yb-g&eDigxjnkfne=bu>P53 zEO*Jh^orl*2V@INk-`dJrT6=2lE_miU3hQoS|^6FN{2j3`D3Vi;7oG3>tchp2u~9R z-K3H?G1bEjGvVz4qgTeQD7GWUZj!XaTnZ8JMrmdWWX29b6Y*5Wa0fT+I(=6PrF+K? z<|!V_lvKpTuvXZ|>W^$AlRs?ZL|Qe|)y%4laGE7_lIE|An8&#s8eat#M(8+vb9O>z ztPs_Wr;RF&n;JB#Vp+#Y)lHA$EUDQ>JjQLzn*qQ(vR#dFhNFfKQfzA8*c0jt@svHo zWi#hd(i5ShI+^{$eRjdBdSLQNC5%yhqfC<;mvMPx$d1cV(>ZGO9nVoME=tZF#Ze>f z)+@%aYQfaA;j#%gjgMxWRdW^5og!@htC>#Jd^b_gsBH zo_eM&Z4#V@py1}zv8p7Q{cu-1F;+2jn)zspw@m5vNWqbEd&uLG-#=rEFXO)Ir$u#w z2kvnr3)H(9_*)SN252l1WuQRJ35V7M{u&^;#x$svKNo1twgg+~bW;wYQNpCiZnnxW zj<7QBQb3g=u|x`(IvFYE&tXEQGbL@Bq(;U$hLC15wqdbMv+(eUp_iNxb6i|^a^((l zY@-Yr%$X=hR$>{}nI`b0&!912yi?8C%NM+hA#IE@DO3SQ7MG6gqA(}Dq2cl&9>6GL zDsm9|5x-OHqB}q|dXg=jywJ zkd`GCDS{^A=*!#(Ikx{A| z8jE%~B&~$rM^LX2!&LGjpT&9oMncqdMAps^16H;Ci06tn(gP&>PiF^BXZMV_a2F=X zX{0Nv-w{JwiI(XYs&f&$s$Oj%JG~QyE6h`-pObS`SO4#VjJctgo_myBHQb( z)g`Zh^+CxU-7Hx&&|UOnn2hB7G3BMDMY3qHy9g(Rf`n;XmnnMOkc4SRmnmkPWLRPk z0h`F(L9o=TU8#$SP*l|Dki9QNzN5D+<{p-nC0nKJ!g$It0#Fj;I<`1chvdvj^b1wC zo&aOu`*%YgogT&xf0Km~>`QReym!eS0ulK;W_hJUgHEelVJ-4~_Ao;VS5kCNGek1r z-r>F*&#?Iqx=r?gdWUGHCvU{zY4HA@jYIC1MMnSWennn0N6iP^U;7Q40q{pYq%U74>HmqP z`Zpu$RLmXCoopS5Wo%{t9!Q#%vZjcwj4_mxP_RsFL!eifoToC79+ONXCJd`!CKi+q zzQSiwsmwMi(Toga94&%l(m6_UU1wi^Vq0=4a&~g^IK$g}?8=}acBU|eVmdf|a`U-x zlmU9yz202l`GTbOE{YG-B=;$Mjj=bOR_Or zS+r2Zs+B9TB~uN?|5T~xYC35EyJexMbg4CV;ZzaDSFvAk1vMF)afo`ZvYc<9+^?E; zK1)73$5NeqF`16TSxh`noJuti_e)i5+`Bd@rKI0R)^D;fS=op5Nlj&L zronyDh16K_r?GaG*Q4&~)o2p2c&L)LlvO#SF>hOAjmyKt{ryAT@B@p7NM?S0eM@hV ziL%MFJ}Fs@6dCqI9UsqMCIV|UdM(RTld&>deS`+doM@m-tlMv*~N_so%Yae>%^*=Hr2Z=re=j{QZ^gVVt{<$Be|tVO!@hz-<+eEGJxoD+Z^ zOi_a})Bi5qpwn&2!ftRx-j35l5zK4wHBoYlw)KmELGJXm?Rw73kYru^o7Xdr&jlTt zfSA(ddQw~&=bB4@o577a-Vt85Nk8Y%BilzoG@V_D19gEp4)UYIa7OA}?N3S0{j1z) zb*(vl{PG=YbRxGP2YWkDW-pRh#Te39<@YL3UV0HGdr(YpYb#Z@ouQaW=@$J2}(C) zcL>`IgtCZlQ5xThOCvoEH)dX;I`*e>1P4x}qlO&1ca{_f+*$%8fy9f6SRZ3B}-T~O5_lR8&kcOS|IX$u* zyXLQ}xLKaSS;ZJ0Y1!a!Z^H<;FrK%V9(k{qY*(FMJwA?oIb(rXyyDH^EVzmD`E041xU~oUyXgbg3q77evl+#a~dcE{`h>*l^R0& zaiMR-xYPV5q;7eDmsj4N>d4pW*qG4XaJoH5s|mK z!9(K5E^MVhe-g#R+THOo%UK(bs_MD$i-wa_RLv}Lng)wO zZ4282^KR2Sp(QAzMX^dPL1s4o?C)$R&BaL#&$JWpXC&a*7ntFKlfOq2^_Ljl6b>{IZYb8!_HfqpA2S11FEDfLE_m5HBcoNwYPZ?y4D$sHSrEPtr-g#NJj$&+ zA#?(g0v6r{7q-~FYD@Ef5p|915*~=8;UPCiQ3}!s{=7BK==6mQ$mr}|{a`3hGtJ%- ztSTK#-aq#;cK^6dsOGh4!oVPn1t@}Hp`(cN60rCo9TgLK1m7}E6npsHI#L%sqaKk| z6g{($LX@+)t(04m%e{d{050gwIa2eIoI3)|XJmSNspmP^-T3cF=8em!?B4&imkcC{ z$LskNcqshio}K*P+Lrtc9!Ux-68(HAnfWXXjTW67)wj8*%uAx0LN%e`+kz1nD@LW7 zGt%Ns0zQ-fiaM5U_@&Z|v6QtoF~QM)-u0IjpM5AhiUs?Gl@&6Gs?yjAHG|ot?}XwlrOh%v7BU~R1?v{`GM1>> zPq*n?_}9BZ&@K0?s(12#0&6~8wFT^%5poj=rWm&H1FYOWK-mHwPhRkUn79%RJ-k0$)n9`5F%<)`p|N-9o2V@%S+Jf%aVvKoeL)S$Rj&6qz( zhJF0B{=^MnP;G=G)g-evlkKldh5sJb0J-oXYy*h6+{ ziT=7K4-;ujrlzkiQ&YNMF5#kKm)L&w;gcx|Qce~|eP4jjSbPo6piRN4H`dOtJQ3x^ zuxbD)6-MudA)!W>Ex2V~>`NH?Ng422O7c4v>1~Qu6&f`_RyyoY12|S?k3G1_uOO=1 z9;d)#du!cXTc7-3-EGS~l`>!t!f~eSbgm+Vvzw8ev;+HBZ42EII8^jf;=1YEmH?iB z9ZyQK5vBKgxE)42Z5!ArQ!l+Oj;{l{g)Y`gI-4tQc_U!gv;iIhQ||Rd=zUDsb?Ars z4CebXFRb?>hCHDv&VMf4yWm8xueu8o7F&5cfiUN@RxHnop4AYL?~Rwwknh(;&$u6x@W=<&z_`hW66_tCZY z;KRZ==@w{){U!;=cG^&iEi$5&*{6s`;*i+QrOz2rG{6i;b||b}Wh5D|5!gijCb&FL ztdVABStGL<`G^G|`St&B_DoSJkL7GNU7hj!|ct6OPwhW?i-ixV*^n&=eI7)1{MrrNc2? zVMLrDvgJKx;(8=qlPLbs9w^qZQ8hoH{bhm=PJk|W-`!XDfAuH--hKUlO;Ewe!N$_r z$o{{LP)=JC@EfR;a9E_S@n{CZt)><$DeHyKPs~4q2GTjzmJlUXU&~4KvgCdYcAuZu zu7P0`2m|dhsW;jBl%29vYyyy>W>0_dE16&e{*d~*5)qo}V2;$rPStM177isQ?{pRI zu-78Itu+2ngO!<$m00>E#Ms8GyW8?})ST#QAS$w;xZiKlZ$|`_Lx1__LT`)C8u-+! z_gbR}rP*p#lZ0LM8_%AVY$lSt6a5su0#frjrQqp#?IPj1BO0)a55t|&{U7NMnZQek zDAl*XLO7~)MhBeb8ro>XOflNerKn;=oBiLz+giar`N%wdlYgQ%3+GK*29lyQ`@52U zmP(lX0E2?I`0(G7f?&891j?W$Aqi~Eb-*Xdan0H&oLn(&fxsQd;KcSAcG z|8i%>LbyYw{|t!P6Ue8#7Mq|$ygx&@gT&XZWiF=K{)^Rmb8=z^fVd+c`l`PjaK0l$ z^lE3u!|mj)#f_H@Z~IV3<((hbs|0(j5>f%?a%^#Ego`~b3CS8=|H ztg5Psi;ZTvud=*$Z6A<96Ju=T&`__q=7N$3b%!Kwl42VnV6rorlO~S*tCA$nbfU2~ zo8^iMOcpcSWG3jGOSc^IyWY#2p>97^OB?OYqA_}5#>w3?GvhqjP9~S;W)Fo#~a_jp2 zBY)mY%BXNg;(iRACxI;+D$j?GXyjOyyR{JEgx&tC#uaF z>Kc2q4yB%mX=7$i`UwUG&x}sW{#bZPhEik1no!fnl())ml_}Kb8K;p@1_FNVUQazHt}6Y=l6$ z+D^6hYY?B4@Ry={LuN(H{!~1;XrH=HT4Q>CO2D;nn!oge)Wn4Pp<5R|um#jIZ~H;* zkAV#y9s{{Q(mj^8AnH`AmDz@bda0}?+VVBlyu$pA9Qz2L*=z;N$R!08H^6RKQd4cX zYf29U3U#sluHTZTsk4?d4TLe%RnW#`ZDYzr>s4g&&Ju}cOE@3OtqowS(fx^mirPY% zsB-*^*b@1{*hhd(j;Lh~x|#6eA2k$YjJX~+NCtJAmBafMR`k5O<1&1WtI<+OO>_?O zTDAH`r@vtwD1+MfmoIK(XE~VgD8^-!2`vhJVU~VHo4=mhZ;)j4H&v$ApEl_>av+6I z>d+7bYbK?VW;Dpo8L@&fB~aq{o`(gSs0b@ZxIMy+E!vjRD#SM`{z~K|uM|7l)hdX?4V!R6q3LWgp^F(<=fA-0%4kxLxm?nblSHr}z- z^ANqEyR5goV9%0YB7>u?Sx%DKN6e;(C}QU;osDM4-4JX;V z_Z%L$cC8Enbww=nA z^3}eq$#+M2tyu2H6UtUeqpHv=2sNLFBV3X&Rb|e(c=LgzDVs^)r-0H`9ls? zheT;g|BE)G;);|}2uf@vw#7;9n|ejgc!H}e4Tmwh$-*4x&+wH@_Lf%Ydy1lipOly8 zmlizB&0$xufm!Y<%#@eeZyO+@t_CSfLvec0dPubQD|3+7Gv;g&0a*5lRbG5X=s zl!Yp2{U~V>`|#B7_^<~IOmB|b4n~@03!WRwIhwHAm7~8i=R>P#K-`knoXt)R^XKj` zB`~>>{hh#Ok&hB1uNOz?21YO^wM%x(l438=aol7k%pZ6l9y2p;C6?Y6f>4-$JOrs? zx1qB&H#9ulV_Tk_A75NXio7h4o~K-Uz58zU%bF->NeL5XLu`k*`ZnnYD>_bJFvq*E zm;WNnMzZzNh}F(A1LSqSV3Ap~7;iWll09LK)syI-GPQxhG&Z-{h|jM&&mlUgXB8Cc zrMn&j@Q&7nXz^>Yyl=UeiyG!2Vbgno>82kq*d4ku#u4H+NUn?weFoYXHXCzE6A@sz zsErH}a!#I7H-uQoxjq8;4DFViHvYV%hn9{DYwey%U?Rv!-kltm*QRLr`ojzK%=sCV zguD&~xC11THJ+irMSsTHl;XPUylp-bMr?>w4|PLR=!tEbr_1=P;_D`GOrr8O#u)#u$tMS8<9X`42H4>yyP+ z&q=b*Ardqa%YDInD!Tf?k#WD3k{FmdAGQ8KtHA?1RH~Z~QN)nA94Xyr?O2c6fMs(= zsfwRQPDU{@V^2pdgrs|-yoSUs_^K{osHdF@59eDtN3R@)d3d!fc{=pv&?L}a(cbE_ z4o|6Rk`jI@r1(aD;1>KULTzs4QI&b)@;gv$$t9-(gez**K55k!XRqn0<&|oUv$stI z-_A4x=l0XswGHBPYxWGDLxVK6tx!VSL+{^3BBxES9VGd24@uRdPF;ki7&^F?Rp8?2 zo{VK$zHy0fVN3t~+m7~C%YS(+t~{i{-dYR|V%7lo#LnOGMuXslUTc@AAyxRBomAO} z63!a=7(z7xqes#Vq2iuUjE-1!#+~imTZPeYb^H%^Qq$&DW${qb7|hf8(CF**2RQ`~ zMjQCePl<3Dg+fG^`dLuXn^TN|F)@}B-;`}L%E%Oomz*9zF3Eka6p?X>nAD`2EX1bN zU&P${LOqg)@-{>!uJxn|QAZB0dqaBIc1v3asi1jeazvT@X3DmRP6@y3P`Ltj%ck#D zkD&pJ%d_baNpH?NmAflnKZrj$!hCXi4v_ABsqEdqHuW#RT(aTkr(YHV@z}knymuFw zXrqNo$Pjz?*G1wz5GEFp7znbdlHd!xaUR;Qg*zObFjRI7o_{8dH$G$Y=xT@rMSXZI z{6~}ZN2?-L0R#Ym1Ny&JlDPl%0r)q|p_HDZk+tJre^t#KP5%R8meI5NZzO)B^54R3 z+=7~mw3;R0;Gy7ZwQ?t~J;gNA&?1U7rh(fTcB`=T#+)SW^@E?tTb_5yy3@~pspw!_ zSxU+YA<bfMCRXV~sS27UopLCBVl^_@Lc;3c$E6w?PP0^KUKdSVeKz?-*1&f} z;lKa#HVih*S5M(ocuvet!Z^oYzdG)(@l+887p0_m$I)RjFOH$=r@t?U4xEeIy^*bLIr-_X%qurDnVa>?ZMS?4!5In7^y(R7KVgCtx z`D?VdBLIY2L(RS>5(UgfzDCYajl&>7L(NF-XQ8_lecO4+;O@$Pu`F=dd@`Ar7FIBB z8(5p=zFVE(6S-z~F4e5Ze)Hr5u3$xvc$ZKU_D3dkulaNsUO{LAG2U0Z3iQhy4p_oH zf5WeA+J5O;c)@TL9>jaVM@wr3zzk_`Eten#s0MJF_rK#O2_jB0+1mz4no$oGkEq~RS(+=@i{Gb+nMgClch4~rj=To&!x1Ji&ZAi6MJ%sg4h4zWbYr7ZnjFo-c zZ2b=IGnC)$vN!Y$_IVQn`5CtL9w`4+L0Gw~i~L?5Vf>ZhpHp|bwX*3`GF2f#Omwu#;Q1i>ut? zdaPn6fbzgKue4qs&dy~iXO}~HNZBj6DMZvgtGr$vPAWXUS8R*|SCSVLa;KcBGysU} zuAHebAkeHvjCyzHM2V|3fGA9TP;5krt1w_MTp`ylA>44=u1txmGGLBdC4Uo2x$4@Y zGGM0MaA%tpE~;Fc9fGCARTK`3`-)sE|BIhInIS&yct6l?dK^0{bq@(5pN-WT+;n54 zAP$mP|D++Vs2{kuGp@u(mi&9hHj$aJYiA^qArl89?cRvVxOZIY^>HYAV0qrzuXU!U zYg^8Q9`X3D7#%DUW68M(XUwxViR^I< zl?8tW>l$&>R9?}~Ba$b7H>zrYz2^d9Ki~GLRwcF>)Cwh2SsJaamiux7ErKf_t;eP@ zyVvjaiBMu<$xLGjuR_E?T3SJE$RK%!so9UCjTDUUFF!V_HdTaFxKcB~OQu;)H=Rn2 zPW)EYAU@#{buqwiA!j_){r_u8o~Ms#lQVkOy%Ar z0mES(oqmp#q?s-`&o=ZMm)pR|K#RNEtrr|5VT=^EZ0o&_l!09|AWIy2dQv{|p`3I> zUQMoQ=SHFfF?I7|%pStJWVr!uSU&jng_B9hIs?0AF&*`55T#alJB*FxDk!D0Dds|z ziO#TyDF~tiaII79ggNyDLW!*cEb%cW7KY#E&*Gx!-1+~+wGHkHn_N4$u%u=gK2b4`!% z+A~BdE;nn3h>srBRC@jU3&Ka)N%~_{qxs)cy4otN>E5Cr~hW zsO`sK-hxOrDD7rQQ;Yo9&qBSC85j~<^RZE{FGIL~Saf&>XHqouvT&xZV4J0(GSa}p zDTI&a`Z>oc{oc~+)B>2U=6+8D(6$D;)Cpq8O|dLhrD*eezFLf>HKz?onS8)%wqaX3}z;` zk}T%V7%^DH5fQx^`Blhlh|zQiS+jU;nqo#Q!n}W-8En8+d@<_a9yu-_LAs$XQb-Lk z0zEZro2ge`{)dCCRF!FO!1Rag3+WvF2xu8;Mhf}WKJ6fNwf{&$Rycp(2DBDCk*zK@ zdwfmq6TPDq%dT;FsItt@9;B*rv0n^weVx!6_UiCCiwkRvwEi)sEiqQq={=x($4pX~ z^fbDGOt`Nw!%=L zjs;lrpUQ*Fux0tvinBj-FzUR}Fo=2r8Du5a%-*F#M%qEsj3GFO4!Iu9bk zS1%>xVtRDR04tLy-}X zJyn;R_+Az^*$Wiwn6(Ot5+*t&Zuj&I=QbHPlBcU4>jPFPA3PaIl55NF+1+M~IEHc6 zG*(Nu5DN;GVa5YiHs&rg(so4Kd+G7noW>>*8p5YdcUyaf3rf!qd~PKB)ns@s6^BY* zLAP+sA<>1k;;WrOy4%n}y`M6lNmK8)d5IH>;XWfOMfeK&DwMM3CP{%f={*XK#y;O7 zR+_W(@-#`@oE7qZdfPt^S`@}SxidMFc62-UWmvf?lJa&n<{uV9`RqB)6rT;2=vAXA0H)3G!ptd&n zn7)*@)d&2Ox1nP#_9I?h6Sw{#tBK2cOk8u*Xsq4JErv#R`Bq1B(`4+;>cy8vcJ(%q z2Cv~ju*q{dIcE8`fd;Sfz<@gU&IE8JTee3sv7WhcM^;XJ?1hFi;I--l&SgUlG9mH<*$Xd$uc zw&d)D%6uIK7lq)_jOd776t)*MUP`^nF4A*B)EhF7G_#NT>Icd@zsPK?l2R`_3X+)>FbabZ6=<0EttlOsr=dwEpIs`+QufI9=!Vf1TwNvkc`c_ z&kol&jQPODPC((zTt1JQ?DI}=?cby!MNp}tr`ZqH3irUBfq0M85|uW*j@KaUc3!PV zImldWGd^xpN5|C(o74>koH0Lc37NX@c=hiYc zK~O!q>(0?dG+9IM4r;bd^YOMSwfoyso*5&YhdP-2Ms%xbJR_{ ziBhN)UtnY72)?A@N4Vfw{}T*D@Q z?i^EgMSj42;a(hge%o^2oGjpsir-Gse`R;(F)FC04gf-2GN)J#mi3An-gU(ned_vC?jFyFRY3epzP_&QNAz6LoW&YjKfUOl8~NKL)<Rnc>Y;m(%qf{ z`>xq6j0$RM)aa8zw%hBB!f27w`lZ?875Sv9Ko{;)!?C!mfgOf=_6uEHIMMgrm!`AmjiGfk?xyhR_C|&3$(l0tGXepeD`f z%96!$X3Nc*2c~HYzxGRylSR250;xdLmTpoX4=02B8T9pypm5e6O6 zf}WaHPwIT=f)G;jx_SY3sNfm+5><8&_Xb-gG@?bdBT{kK<0p-GxC=Y#4#W_v=dc|* zo&)w!F;2`L#gNIh`l)ZWooB}71!h609`Ey(|IZsq$9tYAw(AuRw8`)Zg)Z`@-Meya z$H7bz6)_);CaUn_0pB?i)G%`1HMX&(YbOfbx4$`DAhK?z zdSCzmS_uEGxI+Dpx#53ke*|r;Z1wE*zA=FRl_Mr8t;t}iB5M!fdW<`QAL{!H9@8Lu zT4(x>`Z1N<^YpE3GdcH)8kHXxT`Fa#D6F-6ZiD7AooJQlcb-APNsT)@OKBwXUqLu8uWnjWw-z zo@>u-l-i)2w#P&U?<``m|8T0SQ|jo}LKWlr*{%9qtJgeU#K&>tvz{p6HHM5%t`V(n zeqo&+;T=ofUiJLfMUK7F@E=Mw-wxKm7%<3lESH( zpoP$~+*6b8bcCC*%%Z($c!j_K(nv72!sr8!-Y{YH6zF~2!?5pf#hk(T5v;t%ZdNL0 z<0omtq(?j@&*#w>LUKY&+Vk!|C^Ilwj2g=5)d5?c0f#~8qCt2Uy>-v^DP&cYx~*TiZC` z5@K=8@C-I1g9gDqNP^w#dTlvcntHhv9yN+WPyiXq#}2uwa48iR;cW-(mrXwDH2KvR2-AeNp^bgrG7>d#qa2$cSM?cy(h^~idl+6K;?Cd4KtCpt`xLdfA z()$B6a9*#7b_w@_XsYZ9VxtZ$9Kt-lSnvbhBBpKvWXs~GT;u0+qB{B;D5>l>YjTVi z*ny+~*W+yn0Y7JxH!1-M&Yx(}L2lmur7eh1Q}@x+W`JCw7jN0%Hf&2a;uJUvepfjtgU zEF1YMMV*6*tj|(&s>0bi;+MViUZRQ2?d~8by9F3wrEdpu?J;4*9oot502t@=BL45j z9lMzY0(?ILVV6U3I287{hvWU zvbILnMuvYAswx=i8U8Q4MUu*iCXy)n7mPfjfKp^QNK6$PqSCC!)i#1@gDH5b5Ih&z z2z)Ya`w6bOhR5n#Q*&qc%fjg$IE|M%@6*=FQ_~eS1c4vwtDcMTrrVXn=kr<0764Zm z9)|O2FRV#;)9}w$Er#>uvZB=iTOa;o!lit>F$u_Qq$0G)T(eBwJ-w*27h4}=Eki3h zF6fE7SWXh$zD@H@4ABMq9aB~+>hhs!tGQ`rJy=s2orUJ1dxk2LAhZW)9LeIl-l1(8 z1g46JEWA(>k2n1=M`mv${1w^adwM~7of$5pjI!()`iA(_Np*&-T@n7&)4*w~s+Ssn z0{RpTAS?p$8KteHV?Mg9V@;fkldwVsRrgn<6GI;^TuH`xm(n(KJcH|o5Kths2q$l9 zK_>RLydL%qdq|MJ2H|Ke6MIdT`{k$#^5H177zUv^gR(-yLQ#}e+d||N#LzQ#VK&PF zBZII^eJlwP@-pict!8DJNH0?omxifk50UaH?}lGUeT*5v41v3nQb6{a_$JV)r!2}y zZgB?7s_}YZ6$TRNqejeBFyVo_jb?&cGLD5Y;~{vOk?N`(IP9npGdaXVUq0T#fNB9n zp!0fQeTU}ijfpzv(7&LXUT31Gxz05vz6J64*>JM-tlj`g!D_&=qL!oRNg!Or(VeMB zv_Op*@R;T?@)Hd&(Aq2v*e56Gn@M{YG#PppZ-~cjwo0?|2NiOaibePuOwtSn%Zpv;PNu}ZNTCw1mjEgg zz|UsE%5Hj3H+Fs01Z~P`klVyE;_D{pP1L7UbTUlTDNXG`NKbpvufs(Wz8)0nw^|YD zZlcaH>`CiWHC;^r?MBHGO(q{=ql0o&P)bHh;vTCC=S#4umpe*2B%K+UJ4gP?H&;1GSD~KM42L_iK&EVt z`BE|!qIC4r%dZo)gJh>AQSQem(uc@!)y>;1wOv^PeM|H=lS68V;L*~%UKxa5TBW26 zgYzXK3NrjakAR$|H&v%Z^x`8-`^aDA;H# zk->J8jAyfL6)e4A&|R?ryyT{HdRvtlUPR>S+Px}WrP%o#8z22DvCkKjt2ZO;f&GMvFKp6x>EO zHQa?0iKSizW3QNWgjmyxsYabhhp9lEwiYe^mRulM9R|TrqCu%G;$+TXT{#^=FkODu z>)1(kd@PF*orY3JX==DQlK^(#_&e^_cSn+AL60P>lx?m{_z<+R(jL7%)##t1p4_@7=1M=my~K1>2h^tM z8qPCE(X?Ilo(WfvZOm`n6iseDWKi}ceT*fAhR)JMVx0GMGg{%>G< zqA81nF}rWtp?>h~HwmLE&}M>w{PJecJZsVPhN%lH7`vY=ynl1GwnrqFSxMQkWpKJY zWhOXGjeEa+9#HuftHIiG{?Qf?R->wGdfz9>ZE9z=+2x*%`-=5HvdRB4O){j`mIViR^ODIi3)rFb6tau{2 z(>634+>`9Nh?0ILOh^<^hE2Tbe9$zDeJ5~Z zrnz5KCo&0s?MpwGj2E~RO}2sVF{`TudrLszYLPG{@d!>gsPZaqG&g4=a0F&T(Y!pI z7FGG_26-L&C2?$$7x{7SL0CNQHpf*^?AHJ!s*wfAAB^0E+IT= ztS*vbp!oM5X1S0PY-{YfFlm*)Ynhx!At!*?Hosev2kK#hoE8 zS!lg{4Q45zI0Vgm60i)FuLg}z;QiHILw_w0{tLnG_^%X&|BPV&pO*4p=8>hMsfwif zO_~ZJ1rDUor*V~%2O})^oH3RS< z)5=MllzE~aeWe3ucKI^b5i(>_i$Qt1x#}(&&gC@&i4B%93I8G_%;GNHZzi=6vWMt` zZ#W-)038=|-?l6U$Yc#g{<2o=;=Fj#s}!rWY#-t6&snXq;(PC}sm$Vq}SyYx)N z&B!{})LPiif(|tmTo9IwLU2)Bhxu`siZxiv;Fwl(WzrOutf9tH^2=(ATx~Y;tvtXjH03vg_N}S54nrC44m1X?3$P8dq>k|5Ab=svTcNA-*|X>62BOq-BP)AacANjmZ*>`th3 zQd;G>HET*t4j(~pL#-j08y!l^$?s0ARjT0J!5#v!=OVh zrwY=vNWB;gSOjOXDKw#E;zW$5rNTN~G8n+%Ayvz?YBeU^AJhunt!Akhg;G4(=KGWu z8D%LAR5;^!ej8r35Vg=Df@|=@yIG^j zz@(1Gg+r(NgfR9!ymTE&#d#T_NH*beu;V?uJ1}w3qHyYr@wnZtdG7#riMatU?DTTf z1TBZd%$Z5`(&Xc;`a%r-N}g!YIV3M*105k8cmDw%LMZjl$J>77xZKbsei*G*)xfGS zM%Zptuv$4Mm__X%{L?+`9QvO)jmN51w;$14C~?k6t=uuwH~5CH%ZS!f!IyzN8og+e z&zA_aTf$crQ#e5N-VC2_Y%7-pq;PyLL+Gf(mvu2bt0sA+uGnPcZ~kGf#II1RA5Wnh z&RgGd$oqNsZ!6mHPctURMLP_TykRt7+)F)I!aESwRWpHMReQoUYvoBij7px7nw{;E z2&&rc@(cF}J9)0c{_Qhs1d1445rSYGcA1FegZZ@LL*~StAn$*R0W1Ra);fJp5J*A) zTlD{DpRS;1ZD?bq=xA?dZSr3}JxIku5y=GE8x;^jZ^l;CzfFUVfLtE<^t+G)90gjV z710nR{YXM>&FV-eRxx+-)4RIU^E9%l5%1l+5m1ri-oWIQienCM+UGa-)g_{wBgc5= z-KE=<+vEp~Pv^T8(jT++2O^w6Ujp9X0P-R5uNH)U{>bMWJ%D`vX9gAFUOO4m=Lcdk zMXe(unWBJ}Fbvwa zk)CHEcTd(V>@G%cW#3ptxdig#B9gPkf{K-j%wAaV66_4zQ#^4f@(gisa4lJxsmJ2M zq2u0Ir@~k?xfGqml!H{OQVq-bIPKq>Q77ycez0C;RT?S4iK44yAkT;(K@iIsDo(7H zM@-}BDNLAqnN@gUgPFi|OKb zY10WyHxSsn?rv!StwI~xpVBLi^hwS{>bx^L?D<*IL=Hi)BhFiJN2u#6oOUWvQN}vF z3wzJ!(QIA6iB(vpNR<@}v2BKfGfhyLcH4An3?&Ou!GFF)2Rdoa?MHgx#z$aK<`&t- zlvUNBgtHh-O)&}b$(c|kW5xQ`95EKswae(}pK7aEK1^#KtH)*~5=_^rh4+%v}s#e z7t_X@OEirjm;RQNnxqvg>(a7i;WYd6T9?j7ue<_6DYLly0?zD_WXzC5VY=_GI`d|w zteDzkf}gLEsAOC53rn4~FZD-=ZLAiKWU2<+l4UVoUjJKL!7;q-Yjtdfw%LsxM``P==;0Pgd@->lQY<_#X!*sDIbwDtS11Q4EC6u54xKV6J;te^! z#fQ3Q>hr;V6kU?T@D5Ffc`iO9|5L`Bw}S>QBHO|D&=jE(j+k2b^AO%ws?>M}8pP^X zwB!f~RqOgy>pq!ICL`r2hNH(M+)p+>Bk~&9o6-cDCxw&YyJ+i};x)-(ElO*?RO>>( zs=Pxp3fiUJ$LQCvLel$Pui0Jnr4G~vp|8O1cZf$3)moFJWe$O-Mfvuq=An^2T=gwc zpc|`o)XV|)-6OXcR~kB3nI^!GXpNyLFu_@-c?($W*Ug)wyNM5-INI*z#o8Bi1<^Go z<_5%4-4@Nm5(<~@U6^^GfD8 zuSCYH7km)6VTh&#$7l}j;-f*TzLdazqVw?2@ZVVQyxbzo5Mh%G{j91p=fZbW?Rjou ztvmuW-uPQFCEL77d8LGHDAFlxu->a6Z0Te7%Chf3ZM>X7Jwn(Yq=?LlK!rhW;`HmD zMnE*oXKz&@G7mw5N8Tb<%pKv2r8PE}8C_)6pD-iDUG9LPg+I6`2G-6j-p{g z!2r7qi9b-Y(gS5h>=FtF&v&&>9I6~3rU=#Blqbf=cpZt&MN66BRbPLH6{(;jlIQQR z;sW_^VTIx!n=Rh~#pt{JXRl{w{lChjSt@G|NXqD6R`n-EC$m^E8nlFH4APo;geYc} z_wjr+(vlKT4SeqL)DyeTimdI+&x4URpFg5G@;mUEV8@3`v;ys14F*lVP;@K1>(y70 z?L?$WO{Si{`9Qs%>R&FVbiF~YSr?fjg>tw1$lGl5g4*R_4CDjt2*d59gyIC+P{`~g zXfawdtp`L?6UP#RU6IwLB!P9^MEWp5*2ol2W?Dz;Uus(&Ig-Yvj8PRJ6C?et_E6eS zA=k3dl1%~uk|Z?ntG1)W*K8Al(k+lX6iSotwdNQ%H0&3hplca-z~@*q33?0akX}w4 zy&o-USvXKMjzsx2IoP<9@FcUw4eQg+#r*@eXZ&3b!gt2gb1)&(L!{RnMUew{JMSRp zZzRIjAH{o(JCpo(GEqPxGOI=;dN!j@knW^x`;%TMzi$H?n%!O1^Wr>!R_aKx`Sut;oNIEr)b{$=HAXBmi^U)q>g zdzwz28=UDsY&!#ai;-37Dl;RN;r-Z@cvjP|pKYIgkxn((q0VAvINwB71zw}(Mq`u` zq+QUIU0cdx9cHd9;(Z^KOzv8wERl`4P)EI4qAj6)7pR<7+hH`vgZ_JZ1?Vd;!LcJa zz<#CN0IqGNCByE`EUCvLb&es%0dw-K#TNu7f`fK9K6-5UOwE5zfws)tnqkg zI%X#U67+M&yN-JdG3eD>Vji+XnmU43G#O^;$}rhXQjW(#YzWfQ?M8)M1GZwUJ<;(E zsu#12qly482uil+vvQA_2)kCFz81zI$V=#Smjqn|t|>o5DN+f^Io8<0zB{2^`cuZ+ zg=M8eVcNWc8$xCQ9qnY#)?&Fq@rY)k+8liG?c80(o+jJyQ=z5v=w^u~E_g(q zJ3rEk5qbH&5J!SR7rOjXDN9o|+Tg6{u@wz=rUiwPK^Id;*uSs_8o27dc8*pq+%pe|^hZ?4s2UHWr z1RJ(=zP$b%fvFijFn{rd2zoD@IofCGwN3uUVJG#8&Ydy}L*Kbb=mnIyc^uhA zw8|ze&(>k$((EysjvAzIy3$&hZUZ3j&tvD+<))#te=n zAXhIFuFzLtwB7*ke=7#=zBhAme!FI-??HoquJ;lAqiZ%abFkHOG%z)?r&Cq}0r-Jm zQ-BEcy%N}WR}28)8+`ru=bu+*`#)LvFB10uAw$UUU#Ue>q%>qNJ$%sCvudS32;FvX zW3I_H7;=9Qnb=%zRG?D2((!_pD*zmc2yjo~T`C4{#}jvUGp8@|9=LoU0s)V*bfs%K z43e>jTav{E?QD7c*#Wy+ucJXyX=c-apO^Xpg1&(HN<_s&CX3r<_@G6;7uBte`gx>cWGxY~O$Yrf>TYV5x|{!VLi#xW@ix;2KJbzt?>jE&4s72bf#4M%qvzk; z4>~C{>lJ_P%XjtcpLd4$|6*spC9)jBzKm4D zD{OW?7X>T++o>3}tT>^y?h|X^NYNSucBr)0U4)KfMn`OEP)J1`CrxO3pU1?oWL&7M zkia7@XL48#vI;ml97A;gsqS1Al~U^EX->ZiPl0E2;;`S=Y1zd_l-qAl-(4zMuPXK8 z-H%Ho_mK%S>*g+i6a5kA97+qbZgz~??OS7pv5{k*HKB(Q^@X#r-rBHYHdxlQ1eVpOQmLR}f!sAqh;|xtR!o;B(47dt`vXTJ zLrWvTr?u>M{%-92?BnI*3HWoUD}V-!6V@4|EJlwD?pVYO(R6(z$g7 z@$MXB2OQ}Wa=J8xK9DP;X$0~Ij!mm>8r#ebX5uk!Y&*#_I74`I6k=$OzGATIwX>hg zNG1 zq8U>(!>G4E9TJj#`J!!bPe$_pu!ayyoM&Wmo{wo&cMyt}=+m&UR20hw!dT|@2%(&0 zax`fs{auj0Ru1at{5~&^e?2e3|BGw&AE`@mYiApa|MmVXRGv~*6h;0dr5k}_Km{(8 zXp}3!M7$QSY+?>Ad@q^7SK^{}WN}L)HNZo9^;WwBYotPT7MwcCTg#qvQr&pKJ2}Z3 zVIqY`wvA(Rxm>?$cj-#Ycsc9d`U0R2siam&9V4vd&Dl{w&Dm>;qOD+_XBD(>RY!sjKq>9dH!Y@oC+j$kGijN1Y;B(KDm|)Y!eBN0W9uyZ+6yywDtrgF z!?Zst0pYW<$B%FNq9YtOUD_ldA7$Q{j1)ARpf^@J@+&38TJU)i=+nR2u}G2IlO&i) z;$2CFe>h1}ed#vo2>HrYYXL{s^Gd#=e!akn*S@bv*L|_EOWsRntnj3dHqU9x7kzN6 zXEb)ln|l?3(h&V5AwaJ|wP5kmBA0Y)vQtit*wOi+kjhz5+#5@Gg?vTr7y5F%(?H)a zS^6!fbCp|k`%44!Eu-ZFkv5uMzB&~SC~k)L5Iub)&V)?(=wvDElR=s%cB$NDs1=47 zqJ6?!rfX1lffCcc2xagJ(Pc_FSB&b~BZrOhiGT-gn0v~O%xAxgeO195(akMsU!|h& ziEDFu+*LSBDP6yq%^#Rfmte`xwTsolC=ckzGV_LkHm~3Q-vzOBha51Njc&=ZrdNah z&R=s8rwY;oH43m8(96#pAr5MFH`1_sYE8AhwojcLiF(J|D-2pEvMYX49exd(oQcNe zS)|7>H(c^ZoAGDi_{WeGxLsNt0Tw0Ma^2xIRPLAkN5%$8lW)lS2>>=$%E4zZdylgN z`5d8oJU*|ePBJB+rCxvp$8>zD6n#NF!ZN&tm&J1o)xZyeUF|}91!wMfMj!Uvzo$hq z2e_1sK1$+Tt^xW7MPN}XOlrff==u50+mpKEafm@o(teTGsP>D`9JnK za{nW6_^%G=uk72uLn<9z{@Q>38@gAk{`wwNk-xTW6KsUUr3jJ<)qkSi(klN54j9SkVd8?P!}lgg(;xr}JtcA>?3=3d<#uOs8L-Et z*|BQKH!C~KGct9zCoL3~zRsc$PjlCxEL805)S40Ns2W1gk4A|K0|mO-PS<@wU`O6C z2;&MV1my})TQNPK7EafR*622qoW!vuK}6@ps)j3VY^J2Lqw@+2<^+CIp`qfOZ2|pr z=t85Af?K4iNCEi_cz|nX!BEw_%tk&y7dOm-lM`j6gY!dQDAKGJ*BYwI z!m^cxbU5%z=duyus)AlF8g2=KZZLrn49ZfYoCzw=P>a=tGW%(c?=|E1?d=6j6B7`U zr>vdD>lxdZ(kv^u126$N0qfgEsFfrnHKUMv$Y z76CsVa?m~Q|M=NPO-PvYbO1s-8vR7kK#Eb3(=shT(k~CQxgF+^9SEIiX*MNLh5 z9cE93?v-I|PQQ}kvx>HktE}Ju$FUpAf{qQKD3VU*rIU5_z z0Z&#xh)E2?yXA{v++NTg?9dh3$USh>ej(gIxVvl($zNIS5L(Tr5f{J`)lfCLL5{&h zXnJ$d`YU3v6!q*{KTE4LGk+d-s(&qsmB4maHG*@?ync{p-NRgo&dJ(j}>~#6~%A0)_E(;3HyH0*j?3%Ei=~!x3 z>gfl;avQ!l!u8t?tz9adeflr$5?ySC#SUW>Xx&iVP7*An3R&Dn2~2WtW2K((ENY9T zL`uC>Hmwso#rO$myDt!paV^SbR2>g8$c|!D6kVVLRZ*4Lnp5g>>Z8bC9foTRcQ3~{ z^|yHP?aeDMpcM~w$qUXu?Mq72cl{nd(mwky>HusHfae4sP&POub~#@?2cPOGuwQU8 z{fd+Q<<5SW(gj)BL#)o@Z}pWntsaOQLFE8gPt^M+o8$RpXTzZQ$ssIGl1_ z%q`#J^mh@K9i;P)X5Ghf2Hzzl_YU)>}8;~1Y=%Lu^C)ua1f#f^H zoY#Zw-7BFtDs&ELh?(C`76m0FL=TFP7zl_f!)J?boV(nRCW6YgcR3_=WEZ=AcEABu zpzY{`Nh|u*VzvJL3#k>|v0gb>Oe{yuXRMNA#%%rEWI=j?vNa&p7Gw~dwejkYdRjr&d^9B47eRURZi$Ao{4ec!SJjNg3H`sgl)r%=E?x<$$KJw^(?C9Lp z>(Ej?YFemWk|QC6aM|Hb2uB(09X-O}1R0dLBeooI*?y-*V=a4kQ=gc4oP*_dM!T%m zvO79TsJ3q*aDcwCtfz_76UVMVFWSMc1r5jfz=$E8qEEH34eGN^V;n?yq2!~#Mu;t( z>g<@ymjssDG^TSfj+)_|mvL;!xv&?vV$eFLHRtYx7cFd}hTNzkDrh&&#r_0_?wW>I zQ7P@OQ+Us~n(KS7DDB3uwp$m|PM6JRal-6|R+LfPNm+w7ga5`RTvUot%TZmbj&J%z}7onVP_9x~`lvt>O!&wrTW`aKHLNPKHy{5MasOY+*3wcJ(y^&aToZp{^*dPxnS(I{{ASakm)w#7g zVWX5)rb>%^PZtrZO-_9IF_c(>rrpv&3hfEB%myh_R>bkx%UM9dC!j83$)wV^nz)Nb z*KvG7uj<-9HKKq1SBt}QQ9NyVH-p1&>O?t2H6F%FyV$B+Fg=}#4oJ2Xga$~tmWC5b zleF!MkDVAb7v|o9gujt*oAi4je)akJ>MlAa-h$m^AHHD|Q;!TGY=_dL=*w?%;u)p#$7^Al8^?gG7U+r<&%yU2a-D_bqNW=@m>#eWl zn}VMjeV&yH`9`gwau+Tvpd#l3h2DK7@kRipiDC(i5DG^W;eRQHIig!djnRTZMDH_g zk=T_`71L4N6_id%?+H$Z6MG6==pXR)bN%? zDygi>o^*!?LC4Rd({!KX(wzprg3AfYLGTv3M!-BQx=(KlZe)+$q4{GH!PEN3cfXDjb$VPoNJ;c6n_=xE^a zZ>?^#s*Vz}7&6Z^byO7tltEUOhwOs zL6tYXieyz$!h}}EU7;cePa{CeFlGOdL95+v&tC=z-P@ghA0Ly~KV}MPZ`3R2D5`@h zkX0zDWRW{^uxi**TI-1i9c4gf+O$(zS6hUzh8XzTs!@%Pf}Iv3m*$oRifT)NTCYN` z8afbw9fw2U&vb}`4kdJ4N+csIus7;}Yc9DPqGf-6t{gg%hV>PPtF9>?d7_-wSTEVW zptuOBiS|Ypt)@K|R8)qFy2xBKU?Q}2;k34Gbtf%ds4!` zCwy9Hlr+}bid|E^%j48h@+jpIejcGs?5yEJ>rl>@qK4dG5WP=*ds>vkV8>Q z`d0?vqK+Svc#-%U7y6|h&%Wfju z;ED4%wzXwxR@VxkczcSNXt(+2WAYi7ep8>Fp6h;+NsH^Dzj?L#z%LU7SSp;>+^t$} z_N(Kiq;TzKr!PriQBC&7M7P^Z2Qu{1ov>`rz_3D3cNLKW*b)r$TaC>n6er5IAKy;#>o=R)@kshyO}CeF!(vf`TBe%Vb2|T;NYcK0#4Y3-Jq-3 z?<3)LZ}?_%K0V&Y@>b%Qr!p?f0w>!Pl9>Wv=D#?H$fmTU3F5#KvH4Ji2V%l<;t4sL z?gwd{WtHo3Os@7^Y7V#R_QFwcgBx=fHjCRDA%?>)aG%s3k%U&}F|mBm!S=<}@G>BE zbZ@46FeRs~QFhlEds252-+-I9=^2Lm3&C;;Pio5^_0(Tol97I)o}De#(NxAMAcHtq zX^GRlH@(kY8))vHiu2@th01$KnwC#5a@Rzb24z%w&ePD_y6-ytc7BLYZW|@)W^+&P zWTU^C=?n1Xw7#FS3T+UU7}ToR`GAslpW|y`Z;^BgaFGE74z)v-L31s1H_Yt>g;#4B z*=@F5nnz1WPTVSQ5pv#6gx#9P4&TO}W&ywC){b-bxWl90wbRshuJG$`42XI0q`4evS zvC-3A;?UxO{13G6v)A`4j4RWxg|qH&#R2bwn~A;u!jGrxoA)$i-#}Up^-o-{!T&ap{xgayYq@Z*(GcNVd7B4H1G=i z_{FR?O5!juu7dc;aTbg=rNoJx>CV->&v@^6uRjF(isy$LKQZ;Z9cWU$W}sQR+fa2g zLN6P88=qQh&3r!(zh$u6eV~I0ChXhLHnOGf48cdfW#%IxVPAwabA1cc%lq-e5Yb}*(zfjreI=)RBNe#rV!aQC5`WnTSCXCz_u0Dja7`_ zu*Y++sYC7z-+}|W>kT+qiWRTamEiz|AMJ#YqYsypi`r*o5HM0#(R;_AH7sFoHmNR- z16|D)U!^gzbgxTarw+}qNxqQLql$nZHo>Ln?y|V^!sDckNF!rRF_M24`{79*1@&Xwwt=!?z%F+}V90i>TrBa; z#_pf(rV7wxmMy)f-wQVo3%QKm3nYo&rURn*T*)(IFn}<~5oG#;eB>ymFy!g?DdCQx zE7PA*FoqTPRyhb$cu_qH6vz8Kk|KWT`KRj?kq# zZ#lo)%OyG zHYVHa=cG|!KU&+JbtXj!e%~m?;h?+i*Fhe16-qXZL54hC`n-_}%2xvH4pH zf_^*K<6O}&IsW5ShAFbnyI8x>a3kE@2-)HIQJTAydj9~lI0wo3kB>Vbz~eQW87_fy z6x7^8a(^y?op==ud^ZqBx*;wE7Q(nUKn=)y*)b*$a(^+zYvJWGeq1QwRF6`z-w5I& z_$tX=1D5LiRDhZ)<8q4KHzkx`;`nxjWyygyTgwyqtXEdY_E>Pu4ND_N)zqyD^AnT; zRK(y+&8O@y)?V$hi<$&CSg(M+MnN5p;i2@Sg>9o=^)p~MB(aB7nxwFiRoetoO|m=& zAfac@X)E0Pr90(DpJN=Df)jp#e{rkh%3D3f-{1-IkKif)zY3oJ)^S#=YB^)6p=>*m zSP^SD5OcX2jzTcIgi({BSSV>)9uC2Ae3PBRj>0I5q()xWu|%`z9>y1_kUsJgo%|FM zKLIT=@5Hq>!*SRw79O%o&Jz~|e>QhKlT$w*cSbs0OIwe-u22rWa=hiNJI%D8vT%OQ zk2C#XJ+wn~y{N#r!ev^%(zd%+XE(FNn8t>BvLqUeSZB&J9pp+@D0X>NPXybHvaZ}H zJz_MK96wUVNC*Nm3LJtnL+<9oo_7+0sV{bt-&Oa+Sh*lcLLMOSZVzNe+zKPjFxmg%Y;oO3g2CYW9lT`sX!#Yn7=vTYm#g3yt= z@aWO%1^)7`1~#L_wMmB8n)r;zXB$1N7gqv1UKM>qj8`U(kBS>TaV85dIEryEPzoqD z5mPECFJ?-}TP?uJj{l9#VRRewTi7ykI5X_XGWyygW?m~txQHep%(=-Ps!+9G^4^qS zho|f@4Y|KWN?Ux^gi*3Jcr&@)wmA@a$jubGSS6T606VeF#UCcqp)0%5o!A&L9vBng9cfT#W}qs5G+*e1&!@1uoM*84U}eq%y+) zzz6XW>^@C`sq*~ePqUQQo7KHelW|gf{OhncY7G*k8&l0~0k~Efe+MITEy(36c`Hmt zO?ouq1!}v5vjJwoyt$3!K*b&jo(i>T8SC-jpR!W`mggG??*y~%`B0a(ghCtMCH1oP z&_AdJKb>xz9~|B%{{0;+K`#R(xbFp9=7qsc2AFwcdT=;N&_jV(x0M9-MMV_>$NKl$Vjn| zLG`fw=}L3+g70Hc1xV1RUCb+ zj_|ps$GttE$4#!YCeNia_!y0dS}^J+%fDDqP!z@VWPC&{E|F?i7;)P+>sIzB+af>3 za~ z^4^4%>@CxZ-1IyQf!5Wii+N|ZU3P#VdhhWV1hoS7{T^*weL8R>ef9u}mi+Yl8*1AW zrUNY}OT!@0vi|yfbxWNnpL;E1ww_cwZs%bkuJ?FE6Cyc0%hpnek`9!|cEM#(S$cZT zf`?rzO7~*@m_er0k5p*evPFpi_GPQ_@+a!vXdM~*^os` zzo%dhayr BtW!g=!@93+t9NTDwKeW|8rtWm>tNaPIS`pBBmP@sDvwE!8#0Vj8ve zhJ_TB7HykJORbvvV@+CxiQdekL!1HH1T}CRAA#Vi`eRSp50&>^nC$aj?tn6qN4)c< z7~(GvG6lA1x!mCq2Tlq1)fRA6qEAz8oBP(e>SwGSMbwP`X0v|wT$Gz#qRU40XXqNF z+48r2c+@LWibQR!ib~#}v%#z~23BQT9Kj{>9`neWg2y!!!lb6vs_{B?gZA~I3RAcO z{yY)Mm*6XPqd}!KNhS>;tnmmj?y}f`x6z`p%-niwM3P^>WpTmiAxp=%7}_BmY%Y5-oI!jqTv9K9);cr?GB1dyx>N@|uF$u2D)+GLQG-Xymlc()#@Dv9GILgY1vj+kO?)&vrS zj?ODe6xTwJaFS^B;{2+JS#n`?xy5=(?hV-Ghj< zgZ#kql^ciNc}xYqDH{G3OYl8+CouUtM0(BXd1o}iV)h$vNGzsGqsbU@rn}BRlPr4Q zC0MY*=rH~!TgHdrwI&v~NVu7ci_epBqxXPzL2C56vb4mn+a@=nSZbiPHhHTLEobio zbpT_sk4s-lGg^vkJp^(^`xN4u`Pm!x`@Bf!M5KOFEIDDna9Uf?oI?XTj(S_wrnL~r z4`ty)@2^fL<#5~D=$mWX`A(4g?iZKP#Cso&=60Sa|bSPMf zk6{Sju)Qi{xKSySO(>X$+w3vd?#tuY>sv10C$K%vF5_0}K&zyTUQ&Q$u?0xa?=|1W zinVB;t5mCj#;aQ(-_tYp)p{M5?f~m&?UZ3hnWWq^eP|&sWIGOR)#~Vl9P&3#L+Dn$ z-l!Pfkom+bs|xVJ>H~>2MSU)mU$k~hDcce1Ny*9AKv&GH*?E?e?I;>b%J4mgTqGasW{(jfK;RHmX}Mwbfo*1 zrVo(2Odg4JoDe1+)8tZa2BtNNo8OSPHxNUM} zf2d9h4WG1+nYu|s`f0B?XBL;&qrdVnMy8eWTw%0_v?0;#!-u#Z>Dp_E*tdsJI>Ldj zfDI2B27}r+HM($;*y03OL6A5?d^^(eXo~rg7p} zbhgXgzww?+9jeCl+z`91cw|3xIZvRwsJD2}rl>5O2yMyk1IhmaB7gwFs86GZ>V}9| z5mT3M;x!cyp-^z&g65zzl;B8(sNGp7WALO9vFIw`wtOAFP)q{XlL)D#OS8pbhouvF zW7(k&cVUz_gk!9$~WhqoICRwajtzS3YD6B@H=-MB7Bg%>?ZN+p@ z^OP{DP?Jf$-*Rmlns-=d!qifIBjXrC#G$dFJ$DX`Z|WnsXU(7`_zyM@UkKRpE|Ymv zQ{77-V=%M7*uz;xq*s%H<0gC`(Z#+G{ zzW}t3DqbLPNc_;MK_O?4h15FSJJeqYR2m*7{ratAarsBaU+F(apl^y_$@zN^Y4k6n ztAEF!@1qMWHJr~FmnJJa<59MB_SF&xC7mpC2@7%ua|xtUmHK1-PEbUA4GAkN9gE_t znuRictvojK_6Ja6?G204KhTF@10pV5LM3)nKbX4i7WjU;(K01nUs_^wsd8I{g8jaF z$=*GF^Eu@@J)8aV`NH%cbQjWJsDGF4+1GmUtX~^j^69jGi{WLefT|4bevitf+Lvc7LSnLa87Mpau=!Ezlwms{x}YG9tH_rmCIWe z0lvjk&ui0Tn;Mx8CR6L&pxGqLK71?o%XFPfsfKQCW~@z#F*|^TH0~wM+}RldeRUMj z%_m@h(-81H7NM+AjNeWK>cP%f8$TtJ)6ekrXDHdIQzO&S`PNYMd!t_U!re}f=}Pm- zWY$bjdeW-HX8ng3h%1ThRZ1387;%CV1GGUVK=?j7D8jWMm@Bw=udx@P64IBN4uy4# zQ~fKrL>tq5$)Is(30Tdhsg&&>1}41|#LMV>JRr!c9v97Q3-=zCd52K`)bkG0LiuVI zV8!t0@mgSw@8LSI(AGWp7m11)W*JhbU(vm)5drN$x$>KfuEBXkuH|i+G z@5eIbHrNPFGewrYD>-X%=R?5iXw&4`!=RsU_I%C#)Jn~OPn5$sW2B7?Sp#hu+%$F9 zsA2QB_-wyLSkjobs}4DeSP?Ex3B3FHQIQCMN~;9doo&nr{Ka|55^TW73?vckMfItS z8elP;rW|9oAhzaf=2;S+R9sKeMxrkCRr9!hlytzx!;my!0UzzhD#G7Ug)eJ7x%q7QphRNtP zaR*tWL(~ok#>UmLK|kisQq`3kdoTm(smU9&hbk-|lpK$H3S@kHD?U4#Sqc9T%+Lv`av~uQG4X(;gun~`v#a&Vw`e(--32vxRMw-$}yEEX5{wz|8KEy;jahS-?NUsA9uPIl% ze^ADo1Q%x|^LZn3fg@w=(<69EZ!Sml zRQ9i+t)G*QWIG9+H&*RfYR9-;Qk!pgtnVUMFsKF@z%lx$a(fbI%6)`61FaHN5;{6D zaJM+#sY#V|#qqGT7rVF2IV3f>@6nVVDUpkzy$2p6qPO=c9fGxHs@*yHYGgg3HZ;Rm zaE^-EQfr9$dA_0Xl~Q;giKqwtO zQoODA)e4PTP3Rr7L49)`_bS5f7%9^^I|GsQmtoVgShE(Mj17AAireW$9joGx zIa3rJF5uwOWo|D@?q9jVXBxL+^kVd z8-@*k^3~hxXE4Nb2xQwN#SWcJlu)tn3Uj8l;K-(@D@kgT>8deV>;A}yUvwe4ig`=+ z*2cjHB1uRR7HqC+d92pLSQ+aF87PDmY@Cd3Rwok>#F|&1R~Z5g$%mAlwX<@VeyfMP zQ?wS2GYB_~IbNtRKq4|J!03`>tvtne9CyORQkx1hERNIS*2t`&Rps6_7_f{pzXCCiQuj_CbZYcZdYMoezvMEt_tZ-|Oz$N}CDamh6H~Ew# zqf?!!uzUh%jUpe&jZs-CC2$@1H+4cCHjL=U*#IqXd#1rQVHkn~TA*KmA2gNeQXO=G zYK-U$?|P&U;*}_yjWi_^OPQC@JXjc5$e&|=Ijs!cEW$3JR>?-} zY`nh7?<}v>?$u*+ajrs6tW?ckqd(+a=X4TqS@Nm4Cn)4N;{#1pk9eW)P%s?7*{{r_ z2KDPvdN&_`#qTFpDb|uinnp^R!MfbJBT4ERUX*=@NO%uhpAgqny+Q-Fyijt$#$hN{ z%wBtdVQyaU^yaw44dWN(=$aulQPv7@LY8WUvd}h6h3gEnHo#TYnwkhn48bthl6W|* zHX6Aap$a!Zwwg54lI-cV+GSE0^q)*sS+r(RDKEs5AZlt~M6NtlRZ3}xjCf^=ocXJ2 ziCJZ43nv9K!0Z`SQZvU3p!=4)nmJrY^Q_)siiwg!iDIYmR1BQvte+R!7D-~XPBYPS z2BM#`ZFr~c*gWnNv1B*IYMUY%vM6?9;a7wi9wFaCS=!rkDPi%}#_nH+83JZroU&%{ zy~yCY)QR%W8!eb$w3x*^ix4bURv3XlnxRjiwWKP$%rdsE&@p@kIGm;%3&U3oLz)`{ zCCPTH%>9<=l@~1{@In{jgiLZvD%FK_-1(d4YUB0lAH=4lQb>WvzC)z{#EYSH7tfKY z<3jpHt-zgELeecXq5|S;f6o?x%LA$I;nveNY^wSsdr|JHn%*7swj_QzjhU48wH*{y za6Un*sGrCLaJ=LsC-(T>JVXXM6b3j0Yr^+*i)li=Ftx};D|4Awy4DW)Oqo?uW3Dbr z0IhI0f)7^@?wnnMp>%tj-oJ4ktYM#9Wbzx8pj*TK`~-Xi?gCleILIGGVGhBv-^P$L z@B^s#Zxx~5o4bX*2Ep_C+Wmg?CuDrmu(##|-&ukSMZ5rR0YwLE9J&A!l}mmQ?foH+ zWR+wG@k*$Jl>PEC&)aV;L+KF;yx~y==gX6MM)*A-w?^|Gm39LaGVZJVj3TkmhCXmT z2I03?bwf6j_`Bc+Z3pqw^%;v8cB2l4Lz=%Rcso{!U1kcNjzqSWFqSFH3G?>2f)JrA zQtTFezkJw)Tb2mUz!U3~d?ivX^4Ec9HjPKNi)xT7)bwre6(y}RF|se5?yT`Mm3#2G zJOJ9jL+61vJkb8HGRHE{S4K7uQXKi(c{$@^m*Q;Iq$A6T@p{@q;aSuh?T?G3$%p&V zZE=9w#m3|v-i2MoTs#)y%vYHAufo`kvJtG9rJ)38angTfGO?bG!!CZSK|}vh4XXSf zk6$Xbj{izwHU4kruU#dqZ)pIn26(td{!hV36h%o3aqC4*isU90eE9$XLV0BQ&CH_& z>g~&tPAtiHC2wcZT=(+ApYijrCsBS$hwYtId_tkFSyQIh-KSaCS@+paa(7RBy&nL3 zusud;i^17r%hvIgsF2OV%c?BPH6)M~D*LWI#8X4iyGP|8zx(o!lMHz0WehMjO30@m zJB^Xw^`U=b87IuOeVY!QvI_4!4vx~lUgf--o1U>#_K;-LLz~46oK#e(ic33HG8-Td zrRk=5D;#GeFIR}D;H51|Y0pLy3mwoD-V*h}bFVRN`GAf32B9C=8JvxJfcBcnU^C}s z9hn$tbcx^DpZLFud`CeN7H{0~FRQ#E3=W@3+|Dru(s4Fn3zBsN$j{*jqT>KC?=uD( zrYc7gWWM-y3WFA3WR5sNzKA;0ICbeI2$98-zXUcGCs=eHaYTdvHag>iFJh5FZf`Mn z(vr4478zEBA-ts&db(X2CAn^>TMa@X19+9O0+T&su{)npI{xR(?; z8+x1;rOsi$n@c1RW+28HLf5nzL}7FmmCJ~`3T>lsu^YG4hAzNs9goNyw$wOdWtj7) z3^9$6u4IT3i%qr&%!IH_Mxs5RtSH_HN#_POh;WIf=MFxS&&V%j7*ebj)ZR5Rr-J0F z-W*tJXC0kX?)w$`k~Y_7!jc#0*cmGqfZk6&*vu4kJ_;1#l<7$1Q|cmRb{0{BY_178%0LiI5fVo!=?|UG za0A=3r|h-K0^$rdPw`ZxbG%%-rKifG`;5-)ou=&6JODro;;n3T8K_uItyUjAB)nrl zO=w>{6k#MHMsipGRn)q3+{p!}gXh#*tRpyS)CMS8bVWLv zQiX7*H}YN_PK_ccWSFk!z+Gv;rv&pN1PnDNg9V!irpyEEh^svX>K6)6t@$c&WY6p% z82O-lk{38RQQdjfN(#5vW*90!8s;fPZcVUeCCECMW zWy}!lRoBiFQDNZS4ZQC)uP+_%fKGy%1r1a9+&x1`_n99*|45kfJK*EMN2mA-1FD@~ zxzU1C3h8(Z5yb3!6vwe!RMqpqx(+qX)d7_rj$Yz`)q>snPOMp+e0~wUA}NAu$y_0~ zsBrp-jS1+JMYb{{x|(UWJ5kNohr7}<=*hC9Zw?wQSV|FP>BFf zRP)0=iOO2nFpVxE{En%zrSyxpMQc_j(lqeJpR!d zg#SMR)PEzdij`!PkObg;q6wfF00Di6u4Bo^1zNi@A`y!y#RZe`(c~IC1J}O;F-^@1 z-~M$Doze{o1JQnVWuW);E8Sz8XOYj>_YHOrB_n86lap^O3wnWk;(ckD(ls4#cwD}% zj;^|wOw{nSRx39RH>{3zudX)e^AZmj2!j(&4IFDRQ}-ki{FBepgB*zxDR=Je%lcR6 zi0_grsc5wEQgV$QA>3rvudE;WTGHia5BW&6uwURR5WiAA26P#+E#g%ME}$jOkd@4_ zve`33W^R0{kW@?B2T(4@km4!bsFf*sw$Rn=Gsz*vc)?X}G=#<{Y$+i@BGw2BAx2na0(BAHm zR>~C#(KmJCK^jJZ@tVj(gpv_ju$ZvG23`p{?nh@&*kuiSwpW6+tGE@ird|S68wVR- zuB^yIJq{5Ce+yOUc$3~&XKia$Mqc+2gjw-;|&A^4a4IG z&j*YmrfAkhCDR-5K;%cZDq%mD2h|c+L4un&zPuRICa2_qheg|EN=m3Hg&eSJNX@6w z;3qK1n7%1Z#mnc3I8D_@(a>_IHl!b1q@*jqsP!dQjcd2p{cZ>-wb*Ppy$HFooy@pO zLQ&H(Yk8MnR~&&0;Tg4gT)OePm=6UO=ZPG@6y&7aJD*tBwA@jIj^zMUMd~)Qrc7&K zCf)N^Wz(3ULP_JPMTX9Z_l9M%0-OlH1l5Rx8K$1_SY4SukiTAUh%lj1VL(OEIyJ6{ z3IOhFyF|x|SgW(WxC--+K^imlM6+n_tWgryy7Qb@)}AFT;tzlVY!Pc`N;EH%%2FI( z;GTIKAQ0`Loh30eSeHhc^A*qVEopFM0mk`5utvK&V1G-#Wxor4?l$dFQkkkgvbBJd z&74?b(eA50{=1)gk$auWqTyo9s-qmGtAL2gPWh-yjdpX&fpi3yqD8{skXeKe0=Q|q zSgEr7$lKD9<%2yrCwq442)N1CJ*Kkuyh4$~?+NyKG}~p8sfoRR6pGrG$!)u(hv5)p zHhM7!IdUq7>Xv1g9x|eXgI`wRdAE&4X-&UE>QQL0LScKY7jAU?L2}S6{U?zSiWRI9 zPiEoF#%qdg9pNG+CQLK$&=Xx&E4P*j66fw=%j+;umh`uSG{aRmzldVr-FiEo09_L} zC_Yq}<026E1<;}|uUH?yh(U4u2^n=KV9u_qwrYW+v-gSk!lDE%W27Wz@Ql{3Y% zS-F2@DOm#W0>;}{KQjGtA5MN^EoO>Dx;vLcm1njy){@sW)K-Sc>AR=TS5QQkH*%9< zFKn4A<%drRpy7N?OpbrEqxG}_a%MG#veXeIV80FN4y{d9kREMgG&d=SRf#m3Msd28 z`Nv@zGWH9fVa!eum<}1Rw&Kx&@-k$&8~9kuH1*X2o&DFk)EtdWDnbWsI~v+ zkMi2D3Eqs{+y?CdvMf%Tea_s4Et=dPp)ZMjnPu5A5&-)og6nGL8WF)p*TBAF?r`y+ z>Q-@{Qa{()yZE^2RzjrueR)wLM`)FkpAa_3uMQ4k>{4*o%!y(k_;?8j|L_PNz_rnS zhH)LpiAV4q0z{Jy>%}4X{ec*j;0sdN8o?PDlYhTH$cbguaXDzL&_b!6EoT#EvRQ&n zBzjWAXGiZxgB2~5xMR}zqeKbn7nj}UEua0z;pl%PqW%Zi{XV*uu`_nDHc|3$ayGH~ zw_@L{y8ZXnwN2xujZhvQfFwVOVKA#jC!t6%;arL`q(!+61x@pS%p>c%b0^kgVI12R z?9MWpZd$#8sMxWDnfK$pj2Mo~J0AAzwv5Cp3sFSk_y_yx*8OegX;!!1$DdoXAF_rt zkSK%I=A&WgqQmwQ(COqOHz^U53Q>oW$ZGK_3YdngQ+q(PfZY4C^kOgf=l*HPZKSN4%w{ItAp88`Ps_at<)_O ze_&*$PoXDoW~9{5*L6-Cj~`|v;>2vSt6EK9BIRByIj*J}vTjP5tWMK8MzMu1t%TR9 zFl!(=S3SxFudrSe65DN8OgY_%hel{3xd6hIl4usUnx|R%EwCE1=@-%?e%-1-NNGfR zY1SOvX4U>enSO#^yrImnZ8JGJj{IJx#2u#QSa-H+UGC7&b&K%)+?~4f(0wE>!n(C) z=Wa^I-ka~z?2MfOeQeea*C#5je$SD&TuTW8f&om2VI034XA@j#j&x`^VhCN}7aV03 z1LypXn*Tk7wWdVfI{=vl3~SqyBk6G%@o2Z~O6#KQ&TE8Beewbu4*jkqJfr|H5pS`3 z7p1~$Ta8g8U>ZU*`3U%RmI2nN{lwy@vU*q3Vy*5uL)V5`8EMYs+kR=kii6eOk3Crj zNhoX*ozClllsgl(gNc)a)9p>g#Fvqtfz!)MVPH4z#$&X;#-9)Cut2lXQ%;utt(@61 zjv>3|tkOR5bX<2$0PYd8V8-89pFVG&JEl01Z}-?*Kl1vb)i8f48F$?G3{Y`Y#wwwZ z^c;E2=Eh?JUb>xz;KZLxj9asA?azwvfUq2)WTcWCm9wkQzK2m-rDbX*w{%=vU~=;| z?NBPwqp!N!sLx05sDl?GJ7Bm(8w6m$7S7^yD=tJ6+(wb#MP z`?HZ0dA3Bd%9}>U_^2^=0l`febk-bBoU9c1Q!f(Ti zKE?RaVINk6)Z_&xBX7=|Tx9WjGf9apc^Xt4e^es$>%dJs>Lve(;%t~Q31D}kP0Gp$wLOnUmn_{P{1l+)d|xKfS;hW z*l5?cu#%su&>(f$gPF{1iOZ3FyMHMdVgpV_W4;^n$$wOftNt%H=dyNk_WxcQRJ8sI zA@~f@ZP7{55{Qe8P;UmwFTl5?3h;-}1fYmR&n?*mNTKdD?vz^aJB+mB1t&IS#?1Lp z7-8BBpg}7{XgS}SdFi>&W@>Ew9tdAx_0ba*fF0z9eWJ+CmFO!3hk@3kMDogwu@iCO zP`DLu(g+y2QnfO&GBXt748mkmse3HWlt}4N8(HbVLj^LMsrR3y3dF-i6uv{PEFfmq z@3o*KHKf|gy~j~JYURm`xmW37T9YWzhiR@Zeho-;f783K=9qjKq`qUAsaY1FBt4Aj zIyvJEM?1Q}e(sr>Ia6jF@m+C0`YAf`(K8xCNKU$@yX;fkcZyJkW4U`L>N3V`;q4}l zRx~M3IYXLLWOaj5)K^y8+XrxjB+Jgg5v9d9Az+lVqYN;v*oEFG5X};)f?QW&Ds-96 zsx-F#U>iab7ZFUk=vcQy11--{x||CE*sxO(KK-{9=+T> zqtG3ntEZ8chZ#FJDqdw*^f9HhrgMBP(&zBX$tKjESkKN6I|-q7G^277FV4?V))uhB z$nkT~X1PgXa^5Nrs%S6f5sb{KYYB&>o}w%E0}nQSkr{)Zm)MLCri-iEym|WyozX74 zJPhqi=ep`Fok+GV@mXe~m%s%;dV(mh%~Mc;GrNuR6w*n8D`*RHX>ggZh;@4}>D0-U zaq;gFO{3E)VWqUpaot@Ds}1`ByYLD|gS_z(Is4~5)K=bJm(;613c}SqyKYEYa=p`O z`uqAX@Xa;G-pt_bL3$QDYd`rEEn$TrsV{Vu^cER#eeSXKgXQM6TK^x`-Z9G3He1&W z+qP}nwyg}?c4XMLZDiQCZ6m|BBTsza=~F$r_O9yPHG2JtfA1P2?sq=(SrhkFg)llN zyLl&xX-h2VJXXlySe&aiZUAN<`c@|6G#e_$@OvahaipyF?({2SH!}@sRoobUZkIg+ z)b;dillq);MV^!`XuHrq0ZL_6x%K>cz`US4av3{LjF_^#RMAPJ5a7`~{p5eU01nXb ztAKw`6#@L)siOaAuJK>r-2N#XtCh6vkiNqajsQA>HbC|EZvJN0(D;CPSYd-j(Vs2u zW|nX2DyLC6M3aeIy54UJ-0vsl3<~ErohH?<93}+2mjtvV(*81RN8sHR1kZT%xTHzmgQPN1%v3nt~ORpw2*<&u&5l6g@y zdx_Cc5b@;p7lXWMk_#6<_POxKj0vsX$4WYggkIj<22Z$VdbF3noZc^YCdd};O1L3S zakSunLFRt-fbV$+ifmYc3vz6cyq(oUm}Lg(@GJhw*);*m|G89%w8z+-)pFShbmqSA z+_Z~?{dep~H50dN(!&SvQZT zwV0428aS)sxFN5scvb^=gyvorAi4eCscCGN_TzU2JtCs@aq;Rd-kM0H-3qaEHxc9p z-)QX-pz6_RC`cfDk`-L0?u>ODvHJM9$gJC4O&O9g{&< z5bw_2Seu>gY@U|c8|z6s3&HH92Z8pwEro*F+0X5nFjTyvd<)li3R!PKuH9Hz-C7o# zm)Y1F&v`mJjXJ}gIYwlclWdM&y-TWXwwf#J^2@U?liDiVjsbR3pMNib^!pE*_CF*z zWJz;FtVCy~bRLc;G2WxmkfA(TgwxD8B`3w0=+mfj*P={ZXapejS2>gxu_wE7)FPO; zQc##RRPyDb#nS6FIFjb4bNYqZPTi^K2jil(YEs|jnFlEF#p`n>9rjXHO^4!IK}Z?; z5y+MOK_E#IlPY6Wqrs+Z$uB*$heC`Ng>x#a# zpWpgkQV{=GTJgP(w|zX?M5=zY{3_zcyzB6BaI+)0xR!hx+Op)pkt_=rAi;5KAuXK4 zcpq7&?O4)CJCI!&5M)hTT>aF>K5IX>+&FJ`WA`qq$uHho*c73tv^%Y_vMIB%JE^%} zZf^3(wBmH_;FYz>c?-GnjOkL74;|U4tEHq$nYTmgM0M_4c-Gr-PWXp=j^w7hNCLz(f zKD@2E&j>VNG~#+eFga1O@N5SQ(ga6~w&LLhnS$Gd+q8vy4guYnXm_k&F4O=UZEjE$ z`_SA#?-ukzNb{NtF(PIRH(hPsz-$Iqbb2u#?Qc)AT!t4mIL{4nl%Ny~jJrzP;uC~u zP7`4(2^R1+&?df9MZIsz-EI#JENKhc{4B0{zXhY^T|#bCMaDYlTSo$Z6%B3+uJW*2 z2hRryH&=%C#GH~EwZoCaMoZT)J4-!uVT2Z`ZS1Uts1Hg`G%Ob0#~Is=DkwREmd3?K zM-yf|g~fulNruah0MB5`lI+fN(B>PLUW2n@WHS;UXPas~$NHMpB59n#M$--l$1~)J z-@oTABj~3_)hmtWon%qWUKtM2gUDQO&U@-%dc(LGAG^~x^16lHW7|i*R{mUhOLl25 z^c=(s_knjcIdZ+Pj6-bT!=+tp!Qim_d<*WlW44NNfymwD3x1WL4BDE>;6$X+uOga`8?}alKm$*LGA7g1e@+j zdswc^{m-a_Uwag#yh`kd{DHIs0l+(P=Jp_dw&p#e(REa7u+Ep<_LBN%?YW_yb#gl3{l>1wopA3+9d;E56y@y07?D8UodAq%KV=Lx z#5#NWe;gM=lp7?oRD`ZIfQbKsX&1~&sPKp)om0o|_XWpee|QW+g-)+1TvOiJ+Ftu^ z#b=HE@|@WRW9j>u#{BAA-!fr7W-QF@ZiabS-0)=fHE_#T5R!W&$yDFV`Vf z`D4fH61zC*^uj&%`fAXHdHfmZjolOCmvr?45-LViAN)%ZJF@)q?vv(neZQCg;K%Q~ z95fp)1CG|77-o$vXl&LQS* zeUfRs_v?B2?Lm2x9#Pls6M5JNgL34H;3%WV_&6+mWg4uIiPj_OVdHT&S9t7K{u?Kc zTQ`kr-)Lq=*;x7j@{!_>W|$s6WG5VT!W+zAS zV2!cB{vqthrb(LV?!|0yO{3qBUkZGSoOGuEUtBCOf{%ht8iZ0nHn|$IzLQKU$Y<~*XrgMg^pa4;C&7za0L%et| z@8sRDA{|3xWYL8t+^*4nm)rx0*hB?ghPjIzLCxs1I)kQoRq9l0WU(n2|C@~mo)Cppz+Ts6)*vZt^zF!@TKB3BFsjNu$!=GS*s~JPr}*v|t@sZaIsr z^v;s5s$tIAM;A|w8F}jiL5e({BRf{t5wPi6k(UexJ|Jhk(6)BEjls=j&RT5{l;0Fo z+y>9&x-2TBxHM`~o`COK!?j_RdG_*&_f91*GGbMAB=3l{$R-Ns-RvyiTA;8STk`05PUYm@Z?v!vHZt<{f6q?w+ zdNAAtb*doK1FiG6UNB(6XqU_4WTXyR92umEj2+~ocV=ZpQsy_>0P@zVl6sX~9wZ5z zsi|S*-S+@K{MhD#5Df}G#qefh-}J%8 z@i9kDd@PZ>&z^SVTM>v-KOkgO>+>K=+NzbfCqhs(MjmZuDc-|Z2e_^wO6Ao76U@a+ zRN~IbZ7CJv*{T+g^ILo`Odi%z3n%X2;dj)9WV52Df$JMbNFNS37tdZT+QObTTK-eB z1k=%i@ztnD4kQ!+v+3AxG?A8Dir9s;waw`SNz|F4)^B<|o)g)iPw*cO;h^w+9;Nj4 zK^q5652#{b4Zg5slf%;5*8a% zM}5E}^(U<{5O+Ous)bmcej6pf)*3;{+wnwSW*-4wSnK!#vBMgwLuHR!IJ>~<+pQ6N zP+rh;_3~2&l~ar(k0Xb?Gpz8ddHVdD~4WJq-&g$o_ z_ah0WSA$H&FubeaaVj3N*y~fAv_BlnS*X`?>|78UsnOHP5q&D2>m#@#R@Z}iR@c-? zLFvwEyX-4p=DrFP4SFxe4^o;Uhv;YIJ*BJ2A1 zTrI9rE5YRr@Bkd}OABBpUGk|Ro*jQszfqc=>J7r34yaiLlrB-QH2i&58B(di84Y&t z%rJu#_F{3G?zjTtj}w07mq$n)xxFsr)(oOsh{S|qW?3~EHZlohX)Z>A7-oeNM$d>G zz!OYQJv)AR`UQ{01!}TV3$W&r>}Oe5X$t!OlB@xoLlYH>oe|GNo(hjn&9DjunDl%U@ zG))Y1Mnd`I!Fi=Y!8wQ?4?HdO_V4wz3myi=>LP%;NWo+c6ikN>=Lkb3M2uU%Q9w&D z`z2OL#oq3(&^=nfoVI|q3B$#54qZ(=wAxiGI82a6|AIml2jKWs{~1fhUihNC5+c zq~*y8v15c615O>XFd24?!Gu-1r&!#yFimN$zcoKFLG|t06v(^_pDp?R@3(E0_m``x8VrkNt!Qct*6nsAc4Y zN!I|tb4JCcBHzTb!v!O3wYmk+kkHx?@hE&qgEFN+jAkI3rv{mHR)jL300vSqCN}c0 zHFJYL4D}_!{-Dy36mRz{&=9tpa(Ta1BXpqvX(r;4gPd)*b2V&5lyw`CwUvl!jD#&w zc2i(zUo3;t(t{iNW;G;Uq|+TKg^_{B#zvWdhlC&tnruwf0m@|;jTs5cm2SS7Rh3~kV5FR%D@bvk-9|h zETnYVOnqX0i_MJ?QLfo^%*ChEJTNE(=V_6V8(iE)8Dh*BLP+7YA_9|Qz0Ju7rnPqN zZ0lr)FdEMAiA@pt{WFX889lEBfGsYG_=d1co)8}TOB(L*R6LWK;H*|!A>Le?+y+r^ zc8U?sC5~_*vF6ut1T@On15dF!(s9frDl->Zy4{AOhT}19ASGLV(ew?Z?k+~Nf`N~Y zj7KxWDa}{8J0l(69AMC_OxdZ1{IKIlkBi@~V85o55O|lQKDjs||A75f(+I!>cvvW?Y}rRoiVYWzQ({FB=~Zg@IkF9=Tz*?wX88KGe10LHgxxyy}u68^*>m82*Vl3V%&HI{w`6#Ie~S}O%(3n zKk$6>7PK6hMsYzkQ4X1$*3DBV%nc$xF6T9OO61n!{1kLcqPv@tHZhV*2KiW1GhqTD zgXQwN9NUUJfbMcLok2jPyeBB+Fs(jP6#BSE*jDgHsLq?%A%t+T%~4PdkhND$>S79p z*j%}q{`TOyN7^{~i?=}cZ~gnF|AWfY|K;5OZwGX$Rd>F-0SI5sja^EWD!!BvP+_Y| zdjcRsL?u8}B~*w5fp%V(CAyuqkG=@+;HSv&Zvn&Lxh!OF{Fr9H(1B^qrDU#bUCHjJ zyqUQ>o)1=z=>bd~*uycz62i`BD25w7*LqQbk-=)122+a?wwZ+0$vTD*bjwpgh2<5g zZU=v9_IpgzX3}&Gd4_LjZ^moEM=SoK(hc!1ZuK5vy~a@xJGS5Ad9=?*d~g(Ad7%6} z(8z|vQGC6CXnd+a^-J-R$wcDYwX>AuO1g{J2b@yo{02sN#`|zAV>O|sNSB5}^*P|F z9gGY!idFTnLgeN(#XE)mvi>!$LzR~VR8`OG(rII>_A^4|fRH9v2xtq;ky0j~J$T`S zm0_y(>BmzJ;nq59NTi<~_JH+>mq~9CFQ3>e%rlp4^SVMOnRFi`<+6t+hx0ldGgkc? z5?I3k4on-IWxli^2vzol%zKjQ4+a@r#)$D28(Y?uSdW1M?!jgY8f4Tx(56`hJdSw( zcvDk2_6J;6`I@CTReRFv^Y@4P>h`c35q>{{%ObK;kv0>hMq9EizewqR!`9ydCdV`_>JfBQ{o90_wlY+whB-3uQA4a zt4okuf6~y&IWO3mlJ2$p>j*?Uy_Veg4y@7dwWxnx z*8NZ57?Mu^+VlSZ=FTjyuK$BOlQR_fZ@4oBe{pBlM&8pf|Cu|(``>bBQh-7a7BzSa z(X-9zi>!=@Dyw2-i0mD6nVD2fiI(Q$x<=*AjA_2dTf~Q=D)%8ZpQxcxOL#sT)6PSa zS{xfV89VtdI$8>IdL0;f$tD>7{I}d0%>T-rVJ>bEoIj+o&U#~u0LAKY_R)tK`kOst zIJG4Af7ml^>nbQ9Udq(4U-SpCaOTXt0O0diT`B4WE>o4{U>u=h>*fYL=yH4-! zGrF;UpM@O%_ALC5GM3Z--dg)F8S5W}AdCN+vDiFs8zn>9O*$yYO5%Es`tWySk;qfg z2npyereUrRE^oU3&RF}if)j!pecb{^NW~5UZc>Q??}BtD@}$rffo>7>raVwM(aJ_k zS$e7k-m>i9gdi={Z$i)mqnQrv)M7Gq-=(M^7r7B-CmIKxDG#RnSiPR6RQBDq*^tf; zW!pm&Xv0>n3$N#Ir6m7W%5Bp1k3bG_bwHG$*~i^)*bpCZa3J-Ns&liH4;C0^_9iLn z%(gu$v}ZS|<3QsCZg8L`mkk^Y;oIsINuexdtFE!pTt$6QuHcF41yuV#ZIbE&d4nxc zA4zq6c95tlZLaRFt;-s}dIS-$Rz;X|A+%SA@giY=qj9fZF8h545jcbkLD|j!d&c7Z z4>Fd5qn*2jiSa*+l<*HgP?cJBGoL2{zQkN)Un02tkXTh2tp&>90vqO;)TTr|;{6iO z3*d*sK1dN2%HY7X(J_0&K(5apcOPK;u$17CU{z=`gtnVcG93I2`}+;)CqR4xlB$kxTpiRv_&K z@K)p2Tw+_hKmITU3a^-fDPBH@k94@u=Ro2aQM}_Y(enhO7mH;I>636|P-{J)8@PjW zkp(|TWD2z8ts>-w(n$sbmU^B~V(~`VfijiV-%~VuzmD;20R4e-iTuD74IdSb%EF*F zfM_ObcaA&9eN)=zaU+5_7af^%GeK#No`bkjYVU#}X$seBeE*&q&UnZV)cB4#^M4z0 za{sxOe_cY1{&sek_@*RV{}+%@lltYi-6z%`S*JwF`FJ6Vp`?~FU29}ZG!(TBI;}hj zO)V-~3W9NxbTZ(DbcS?+%9rUH`VQ*IFs+>*<@9BFND8sLte zk8N%xHVGx|W$%Pex$m3DpI8+zkQ83*mnt7tTUvhIG-4vJROU*3+*l5)DfXK5A^Clh(x%6{ z04DD}AWF`VNGo+Te}^IFgzSLxGW7e)j`T7MIw!6YN4(9_C>xs@F{B%e&TT^(0e3HZD2)?Kiv)?>MFx^M29 zKBsRsextRt(l3aLR}1ATrCoYYG($UcY?<>jYUG6FjIE&}ohTj^Rgo0BJzlO#{a$l> zUe~nU%TAE>?o*7gFmozLD>MMLRa6kWMlG%v-vmeLh8`z{p~G#ca8O;s6q~ z!$Cz5OMcv4s&4_KFncKo8+2y3Hp&c@C-fM#^C!AV=b)$_8FI|wQ(2HlvQ0;Z_|$W& zZL}qZqJRELoQXJUXMj5D#UUe2&iol83~eD6u*wLfK5|ua+PXwc!ScMKbP&D^;tCy1 z*YJX`?l2?hfxGZTkvOQJh-j**5 z+`LBJAO&Q_CvK!h-&G3pY_JNfs)|b&qsjYbxS<9kowpwb-?r{m=I#UTK(Mt+Oa>3k z36xcv58f;d{#+z8xxA;4G_BXe$g+A+ZAdTi^6~F3>Buo#V6Ru`Of5uSH2H`JdnZFs zA7WRol^)zD)Su_Fg+LJ*jL~c4cIF|WuK^*|Sib(azW0PGF4(Xbn8;K2jGv}N{T+)} zcV5k1LC{tcAled^bIo`kvq4*jnJbAZ=K*+tJ{M=;8GgMta|z>jYi7?m^+^zVlOK-% z^T94Z=LeHvkypra3ZibHm1N9Zc|*bpKcX3YG#}QvVJYFzeyIYowkK3~;^5sLSN=2r z8_cjwP+G7iP3UXG|_q&qqsGW zv}+jC4lbu4xdrmF9ak);bLzhp3KkOe`|~{EM&`0TM@t(o;1I z8yNPXdMyKzISid0yr__l?-&LUi6;X^^q-eprBHQQ&Zrmp!b2S6_M<=1^cK`F?ttnD zK7vu+U$8YOPJDN-ZsurCeC^s+hI}@czU#|~EcJ>s#%=}4Tfv7H0BUs|bJ7n}7kC%O z&;16^2MF9@=&Qo+$-Gew7mD6vcmwJe2z0drFB!ZscB_cq6FI$Z7ZlxQ@={1%QWYlh z(hXs@`ZG|gFmtAU!2s>G8F4SHqVvJ5B0kcKTFwLXbBX~jt&oJ?vC$f_cv__HG62zK zurJV|sEXKg(m(fA@C~-bJ@ER-9*~Q8ZakK4$*eNN2PA%B0*io#VHG(*e_Hwg_0bWB zRksG4Z{tXVc=~G|kla&#;Oozg-QxeDHvV-V^|A{0Hs3L6RmSHiL}=hb;|t^K%HxaY zyW`Mbf>gS5ZYTs0mb;rLCIld#Yt=>9|vKJ2N%aCP5I)ABNE1ngoGi z7leTj1j0BlNWYgVaf}2rZE{faXJa#6@sd^xoq3-WZFLD%a~K!M96*zc)u(o~R>!KE zmD@_Ql#S|_)3q0KIxQsN>uAUGmeUyB1AaQcK^q{c6ekTne=!}2f_CS(2XpnDDNX*|>m#vdWhIs}HKfjSg> zM9X>v2B=o(rT(C)67Kmh@3V9UO<~fQ>n22WsW(K3Rv0SPVbsP|1Ib9s4bQ4bHE0ge zVX#Ow$@xk7KgbOW!(^EzM@$j5MXZzUyI`Ol0>f;Onj>2kLrBx;4MSmEmu(Hp=u+yC z*&DXeko5v`4S%IZxMLExsEUAFq1TI}2RhV?w*=9JxC3HeF&fZ6NuIFnv2Esr;9aDa zAEVBZ?;SF!*_>i|02NDceilXim3+g6`IdI_1L@WivWI357HOMefTlCte~V_1R_4!- z_?t>3U)la&4K2J#+v9ONWP9w!n~~b2nHi+;N zFSw9B6Wg|CvE0U;(AO#U5`))c_Q2cJdp<;XNqeTtpWQ+Harro(M0g1|fSBFW?V+UJ z3LzU93-Dt_t)a3Q!^A{zk?txXpD$ryBO=}^gCht@V82!lf8BEc0jdiOB7)qH3;rtH zx%_Pu%_rV65zElDbiHxt>cZ~s_L3Eow{fg{aO3KwBXY?R&^eEbVGok+bMXlx^d{A^ za|pwupn=$ctE%T!SY*iVQ=LcILgEH*jgPs}#tN;Ow4F*T0C67cMZ1 z?+E7OO*M-~f+Gi_Xaq^<<>KS?8M6NLHlfAd*tl$GeoaD&)xzn@LB#`SXD6yXd;RpJ zhRhZ-u?OqQ!9&Y2mCuG7YVioed6R0-cEmSKU|8A}y?26|#Jv_f} zK(u)C^;%j8Y#A5&;n)cF4n)p49bUk|i8w0BB54e1p%X|{&4!WL`L`XlaDByls88-j(&OeY ztsXnvT6t^qT=mf{oPp@fMrSy%vsHA3T^wM>Qfh2|%Y^Y33g2Tlho=yu$N?ZBwwYRV z@TM={g=46sqAw^9;xDAvJU^AgSt&|QRJm~J0v?S8_~wRomYAlkQyB{1JQC2zur=<7 zlP-Z<93!p|qmnp?llNmQ&a5*xe=_enZxm_pNOK`hugLB%%1ypK$p<__LW;Vtyb2p1 zwuw^83z`~xBo3UPnAmP*K~3&D2LTzQr=*QN@%7k|-y_m^x4Lrb0-t$gpaUPcJ-R~( z51AL)xxIMl_Ps%HR8PhF+YxwOxwxx9$AU6}y>gw!@t@q!)#auH$ROuR_l_kmUqIK~ z1&=0=>_0p{fMCd36a2V5*+zo`Nf&0clSCx=-fg@3rB5DLK9-S$WUdTC{kjAo+X@3$ zq9bLAqX-|uKy7+?;yzTCXoThF)uG#=p&^gPOcriH*(*Te(q=zD7M$|P@CruM-JI?9 zGt1w2Cz8QyB87RESFPLhhxX`NsjW=aoorv&tAZZmxc<)}uI>y*`Sf0Z1v596h6QCN z5o*W87%50*7wP%w@`Kj{YDLhq=+X{n>-P+AICd-xOj2RQ`^QO&)@*c|H2&NqF>vPs z7`pnr1X={wDSTYbQ8BGy5r^i};>N|(IV5ylMCe)Ba$WViSxheSwkh;GZr#ewNjS%S z4{9?C5pSTq07(<`c!9EBM2?Eyi5qHAJbxo7o=7!Nyxi7wivRfAu|i zD4t2ZAHh8oFC=`TY>5}iA6@yrscwrNif}w3$a$AlJFEhp_TTjqz03{i zJXmp&Ret$oiIfZT;HF`GQ0b< zU_3kwn>>ARNXTx2!NwI)W4S6HMV1JJ1!Ucq3bO?=tuQJ?;aI%v>Mj# z%@-Sqle~ip^V-E0GHQ!_y93o7TPpGq8-Ty-H^#mH2O(pI?+vx;?v>q>cug@eW$dsB zXUfbYESeLe|LCb!rtj!}eU#*bB&)hGeC(Ob%q2=OdH$1p0)m|0Tr0G2uH;3opfD{m&19svBe`vrCu$*HT086 zA|U+EJ9egpR|L-B>Lh>b1U3i^%-a{rnilvXCgf&_qcDPtwb??LI*8q^z z{PQX=)A(>h!s}999)Cqyz-6*7KZgmOFwp3XFz6K$idet&mtXI(iJ41M1@Y*LiBgoT zUS0sDP)eMvq$JOCfxhWEq!glKkWRw%@pbjhtwztnlIkABgL)$j2PJlqZVQAm0@m~z zgg9#!B7bkpnMVWz>Q02T#M!5BH?G##rj4?+s&?#*d_VfS`;hSW#6CB9n-$QmZ`!)~ zql}{#szHW5U%&H)9G6zj=yJt6ynUiUyN;Lbet9$cZBsfVu}tqN1hZ0I?Z73xQvH;> zITt%#hR?P;+hjSI**%K+hrmyTya0KSl*IkFfD_vXv0&#qS>rq-l6~NKp%O#Z;!+;f zVgeyL5)O=41V&OmXq+yP7+FV;raTDd8&SnH$+lp9?o0?~*V_;U{#O{1AvaW0sD@FL zVOm*Mc^=m`aX8cZO&S3WhpRV%+T5=AoM5Y%cQsO|S4lu0Bz$y)l-!L_NX4{h19!htZ-v_V}($(q;Iz@L{YA zD!gIP!YjhfMR5#eq0)Y1Pwd~;h?mB&ioX|=DH*p=KJ=J;(1z=wN21)RkfO@fp2wf7 zs$GyLRjXVLT^e2ZI7vb^QVOnp(Mbb#dVIhGIdq~HxdK&w!iARR=Ta#@VrR=tu9VM# z<(p4dw!WAwopGtY1Ku@=4jn9}KsYH8s~(?I95^bJDfZZ~w=}J=tt=ta8`&qchUtcb zyGzOBlu``ojp)P;S5e6UN`i7qHYFT$7TMNFa+!;kFHR6>8`0+ie}I&>2a$s#PbrU$ zpKR76iSR~XyCW9p>6yjS>E^37C-F49H81BnZ5Qbxn&*BnCyEWC($YphHcdf9AKOc3 zNrZ3BjOfZGy5T~^r_)M0NX*`wLqdYq1WnVnF-Gt3 z`LPs^9oHdcQi!?-bi$A;0!6)|4_lXqfE*-l^r-=$KhmYtPM@LA!;%4(G6bvj&QRWL z)9givtI+I@)!b8Yz}>;iQ*q0EVUxhnsxDa64DDi{KVb?39YD~a`TX4Vx%HKuVq6z% zm7PE0hDX`4lK&Tll3$Sm3m|8=LtVbiz2!nes;GIwfU7t?$U{-x6b)JwE+htIFpqsN zs*8Olf8SX?!R?4DW;k%FcfyYhq|rHF)o9elVM>fvB`Nawws}R4``>BJjmr0R3d6$WVz?c_JhQ4C-hRv%`L+tvNTg8>{NtplgM(RUX`r1Nq7oA88J)f?MK$PjNCs%~!Au45P=NYd1c9h= zLcq)aAOJwzz@`oJ%_;g}z1NIvi0@)FnLf$J?uv12I(YH}lAnHtKIF&}$11;rbn%}C znC+6Yd@7^DZtz&5&NkR77)Q9$IFdY~m;O9Bueq`k+ z_X^BRK+eOHK?s0>5P}Qc;6$gCo$q^6v8yU)-ssUOOOr--R3705)k4+k^n~op zZa_N__Y|`ypHS<#S#RN&vG!HoU_~=|QkR)LM3Hj9l(=I7{D_&?C-x($6SpWM9w}te z1OM7mO)L!7DgjfLJT-_5C8R}sw83erpiT_QcwDT;BQ=a5zB8-gO+;A2`_o@J_YuYx zf9fJHiIL>PaF0>sh8Gw$O&n)24JFJ5n>i5Y1mYN*nnr7oRu4aJWH7C4P@-hiTpudx z6RyjA38E3x|EjVp13wVe#XybLH>n7+o?#TXqN&9739%}6m@AnHe532R4f<-&p45-v z-22=M{M`F!kG~Qri%L?F%A2955v!SjP?*o_fc0io??d=bQFG>8~@dlEVaSSIM-=-n2oXzDVi9MA%FKtkIg^}c%F%i?tgO%A}0fEK} z*XR94ZAAk+5KvN|s33`^?FvLCc@dm_BnslycPqC2LudSr6yCoTeLl7iNogfmm;fJ` z`>_JsqF-N6in~7Q+3<0bM_$}$*g(T{1>PWgE03rSZom-?J0ucLSQf)lz86ZU40bJA z?LZ>AtTKTnL6isJmqs*N`Mhm?M!$j?T_<*w@J;KIu^wi~TNlGIh^o;?ybHoq<*p5f`K_76fGCQ#ugHN2C zHO-;5u|3PcEZ1O_r4Py!SV%~bWn`LaM}%QZkZ|d}stbk8&Ah>?yTp<}XuID<@g;`! zS(f-)k2?m}TBC+ZEe2V+ppkMtSTuAY7K|9H`Eru!QmDawx4e|ih`w~Gsvij5T#^|E z*?jJP(Xa4?n2QyIRu;emlX8fAo2j{WZROi@i6IGevq4OQq5#?~%PY7*D|#8DS>7YP zFCo+I6$@8zO+4hP?LWr}<`Kmh!pw};vn!_@!NTa<@n3&-y z(;xE@h(7F?0lIbLo|Od+RKx=e`l=Yz2CbVlCl&Lwrywo>J;tgurzwrq$xkp=!xE|` zHB=J`CSyE5H>xmGs-(P{S>H)Cp7zCblh>%U=a-ZjOX^uW`ve;@p z?RYAE4QCVZLVj|l4N}q8nu^Q${GN2Os5DXxTJ5L6xu54A7OAMNJJy)&m@0igiu0;8nN;lbm<8CQ?`GMFz+H}I5Uy*#}-2*9Q^sM?+UI?qj+!1=&nU4RUytl@a z$_k91i*ik=RH;GKspB$zc{09&Mpw0&bR)q9pr+nbtDgGO)TwxBQn7vN$8J~Gr0S3U zAQ*3$#;Vc6{DC}Mk~!TS{}iKm$0 z-z6#%wnq}S;RKKyhs>}9KMYQO{{~bH#JKgRbP^Rr!Xv-~ps{ zPqG3wCj^@kz9af9$_wIN_=e2DD~5qrp4wNi{2BV&bf-rgwb#NO64V_N^#yf0^oJ4g z2N-*w9V0-`fYq+*Ch)I4!WUvbsZad=`xlfCOg}KczSKQCcc|_D*j*dJpKd{?H#H2A zZ;^YsLbM;!8j#nJQ#akS(4|2$1Aal7yTE&TFS+(Od`LMVvBCVk7JI^u8pniZXa#aD zV6g3UEN49C^Pmi}ZnRYG*o?w%(57d$Lo{0klgrV0n$KKEXWK%NS3Mk}&x~?Q*s~Qg z{T6Sp?%lqSax3ZwFrQRe<#xS1KIGH$KO$Z|*{7FxqCnpQHOl;OkI!}ni9WqFtO00P zjSbQbu%?+OdmV)dyU>k-^I?v$E$#jDA*o^2_lO3XG)!9YN-=E(EBDkIv9AU#2Y6c- z5r$1dR&Iy}-ZhL~5UgNJ>!#D9siWI8>>Br|4w!UotovDq1$E3iQL&?+4HIvDtr__O ztB29;yKYk#{XjQFiEEHiFA&TQ$m%fY(I)I0S}|I}n%u)zBU2;PchznqPY~b>lyUk1 zZ%LlQVvT;iAU%a&7ifP#c#-15Nr-KdNw(^8;qxk?K1oxT^@I$s<)Q?&6w4b4 zv?B%1yR-_oBfCiow+5O#v<5i7=}-jv^G zALV)>U(3&-InjJU|H!P!D{Rd&-2o1~^33qTms5=SgJ#_4w+pQBV3&aV2mK426U>#5 zuc(Q$QJGc+DI19Sa?A83jfPR1eot0~DJ#HvfY*2mpGc_v7E^+JGPV!ppqinV8jjh* zjUTG4aLvS>b?=?s_yp+9rHtIN{tC^fZQOr5k2?a4C4h)et~BhHTpH;-U!sdFEfPtR z5;`(^f`zl}VV3F?yExrkDE)Vr?D!Ci-qI#9q_Ywp2yPA&U(p!=Ka+3n3J;jx{ewc= zQK_F$RcGcLOwFEM-;f*?uZFEgsMrX|g~` zV}bs1^Cg0w{s|F)5rhdr+jADb1BeUK2y*=$hRrX6(a^ojkH;8rz}UVoIUb;$ePFkQ z82nL0x<$pc9&6b;~Wjwj0uu2!~^TtNF1rJUY z0_o)g@xgbSsZe12?&~tvdN1#aT`yk5%Q7n1jR${L?nqd_RzA;v0$;Q(eL`qLv&7GP zg6rpzarX@(-y3=OLIKS#wW>m)@&)P1HR{J?k)tj5gaAKbu*rX7UUXG__ptm`@}#}E zEpW-ZxGi(}so!t2*sX3f#IQ;D8bGaIiBw?7@=&)*i_@=>4pOqc)w(R}}| zJHz}x>CV_27+D#Znb2C;n%ezSZzfxALJC9>rs^flb@tY!`$ZD!HF5-_u-KeWJ-lXf@O6 zb5a>oi{B#FtW&@L%ja&cd$bUCnWOEdI~vF4Jg^@vzw_dkasQZT|L(BYsaT9~oB&71 zBU008VcH@~m)sl|w%28%lXZ$W4fN@-hy9JuaTdde?&>PTu?D|nsUH^Ug|FsP%%{pu zditWGL8krNujimb{u8L5wE-qoM$bYrEAoRKQ55Bki z|Jv*R*R3w1fBDa}b+NWKFto6?aQ2{ARRIM6B&aPy0{(jh>iekx-xD)`fByBOnf^zQ z7PNLV@Nkm*{<43PDL8&iZh!$H#826L_1On;!XFud(BVKOoPbL3r^0UUm?StuE1YGv zkX|$}e6KL!@J|XPL6JN6?_pf`kN3yRSI}OzBi>2(v_}T=S-%w1si3E1GXMAp-y{#} z$;R#WL>o#5bd%ul4rh?=&&cq_mD z1ZEX!k#Yv=IpZx?i2L_`h>tDE^TlwXxUlHLfxke{!^-m_2%4nWurcQ$R#IQG=O(%ru_!EQ}Wf-;P z&<{e!ID~2fSL*Nf*V{4yNP}(p{ia0!+es+K|Bo@!S!Fq&-mV^BlE4_AtVVjIr~le( z;7uz#kop7Ek3D>W3{(2i#y{9wMz$HtxNUnWh3ha<{m#LkOk8#1YSjOEysxiDpblyA z37+$WlPZ{0EQd<3GOW*(CTopOgF1f#2YJ7(0JU@}Emc*$t&A5e>P$!96iq3m z&L6-1A?C+TyEA3P@NZXsK*9L&e=xM?uR_rrS>Ez4RQwbGzXsZ*%1g8XZ&xtx8A>1N z&OGN$r9kkUJC^BT2F7qc4kCmx3K~%C#~5bp!xfby_h9na91CfXA@FM9FH}(hnr|%-)qWDO#DckA zhA?lj4of}rJ0J>2p0%!Uy3(Z&_(q{@1&~xCT4gEWx@-B>`@`w_%5MkAJ$41K8R!CJ z6}8N7LN|V{e4eCsy_gYIxAgHg8b{iHYY?+CZ9y3V4fBGN6991sf#A4a`_mX_3(zCy?}Rkbzd+ko+#g1nc*O`SK3X(suj z)CdNZmR5||;HO3|?+Z~^epGmi(;xk1QU8HIt>Vf8`u=91zACk&4uGmO4t#q!_P)cO zmq-B$BTQ-^5jQxM8b%JEf>rJg1EJ`AorBcNXE#rotG3Huf1k*BbT{(e-)fitTebgZ z;rkD@|5;-tS$S+m1Rt;r8}keyX$xePCKXjW2sIqfeUuE*Xc4}4S+CQvj&zZd718q_UWzeW%o zkaW=b-8^B`<9hTG=jhxgOgcssFNzaT+GvaDk`BB`|Vz7sw62HAevjNpf(XLn(VqAD#L|pH$;FJ|Xpk5{{7e8FPKn8nb-^V;-xQf`x#%j(sm#jRa43 zO^g)SejCHGLF#oONS|eMm-M{Fo;o?N_oq*=g|0G0T`AxBzo~rwcW1I zKn`Of`c4uifjw#5@nrPjPNQ621#$Ufw1b2^T@ z90%$MFs-nh{!G_3MG;J;NvegP>H5zUQ%CZ_NQxf3FNbU`2DbD#zJH-%5&f!~ar5SE z9QUqX6}qE81*OX5now9^RwkT^A71ItHs+cKUsXvOgGLa#t_XVeueh#A6o)`2R<7{Mer2#uQB zhbEucoC&e@+}F5&+*j8BqlEnr=$Ge@?IJ$}1cWezix@FNWk-3`5@3G=v7dX|>D&q2q z86!X6e~%ie{`La@;i9tSWTn9b;k;{FW_3;%r^~}Ir@I5)u8ipdh|tm6Caq_goySHd zWDGvi{}Par%2Y%`)MX`ZO9@J8`)oD3elc4Dl%TOg&l@GIq}yhi^=y=vW{*e7XUb&E zHfvz@ybH%4={^pBHRIC@XPp*Vlu%eAN$j=hQ%dk6gR>EBYQLudM+l1K*)I8kxm+|{ zFiXvSX;@6|ZhICH>)w6NiHOj7sf~i*gZb_xzNGU!yD=oQxyrTp7nXmo$`0E77nToE zxpN?KJzW}7-;+(N$u1vh>-ut1^7^mm)T`ygeAYgf&F%C4`1_?J`unAGuyC=kHZe2# zzeDnW|2&-C|M$h>CQko$t@v-1u(MRw)lkLJKHw$Q6Doy3jDD-;t7IS=NTZ_{T1E-Z zgv5dd1OvG<;D%>R;x8b7=z7R~M0YgG^G-R!{JG05w&g4KRhGZB#sEj*gCul0xX9vp zc)z&ZNPBwd6!-vTjIc$K*xKdX!BXj^v}}s&l8q|eP7Yaxo>`k_tlX{)@q`0Z&7;AA z?K^i2!)J`9*KBbmSCq01bC}a@>>)t^vKzAb<7d!)P$}(l{k5E;`H;uhtEE?;#53F4 zgYuh&`vdmCY*sEeTb2Q{Gkimr zql#`J%Qr#CYUOmj58qaAG{t6X*y*(9g04l}W_!vx%AO+3*vN8a3GT(wg83;o5ZZUX zlOx%C4cqZ&ap`Y`v1uvu=EM63SoN9qBCC+x`e|H;Mwo|OO-#JZ)Uo%)?`wk7GMM!4 zT1L;{`^dJ;e9pZA_boP_e z!5UH(ChyTo9Hq72<;fGHme)Mls~4H)i{ISI?;PX@i7rm3>=g&8+3s@ndcp7!;})-> zz8W@3f9h_=B4R}u-SY{502Z+5+tS$KW3g@8L~WcfW==%z@VTh_wl#axpy_{=>mX1Al+)1nPb0w(80D)^48#Ph`lV^QeGO7KdbEWBc7M z?SS~!e}(G&hBRC(c}qGDNDr;`^)qqgIU3g86eQzm3p}zdh$WIVigy8N9J&E|Yz*CU zJ~c(M6pRBOcKI^Df=c$A`4=GFfyehCb-$3EZfg=6ga?&O#Kpv*z0u0hvX<)%pIsig zhhxbiKj*a`t<%??>wkRdUmTLkWe zRcVp0Yt}=KwAp_b{8lTv%|AN*Ablk)viB~QS)?=eidRPRLuJp8W<^z0&yZL_v@syv zOE!BzNI`~;IGW}jOH_4>1x_>wimZ{}!449M7^dad2|~?-QJ| z&R@Ese8O57$tpC2G!Z0Wh4no!VPT^6#5rUo(QLerd%&#vz)>_;Gs$N)uSH4%RsbtM z)~3uWV1Q?}e+rZ$etc}Ao#$aJjm7MK@zQn^WNa%pTu%E~3{*`vYAanb9{^?qQHhIX z7S?_MAJP#`XZC5zEUtQgl3s$!03HVwa&J^>j+`mN-QO5XLY_dpk?pObzJD}gW?dAJ6a&MXSMA~?#Ik$quw{V}42F?( zkS8s!rb(etr;gahtcU7h)JuuaUm(c^94c?ZlJ7!t5$|{ zp(Sxm%N~F8kZjH?L!t0{6Z%Wd?qdC!yM~50DrcphU0~VIU1X_=fN*G7og?<2K*sQ> zV8>@e4Dmd*$YPLc7OtJ8bz|)xD6H($!tJ8dINV1dV`G@rGWRUp{EBn_EOXhSQO{^QsW~I8{asH7)^{Y( zL8Q?mN5leRsdWZ$PA2@hyR?Rc?<6iEPsd2ZmJ=2vOWcmqY9ogv#<4scJ&Cz!e5}>$5ordLQkDs}TFOguC_nLdT(sjEX2Vx1f$MrE% z5?U-(G*XdnO|~D#gS`Nk;%LzRXjOWWy*9#pjsTd=mSPz$81c2BqD&{lmSKIc!PdWs z+4Ytg-<3~XI`og;8eIPe_(RFWNzlm1#L>~h(Awm0BI!R0y{aPtL$X&PR6-0rG*C3k z)hN*vB_dFWZAaETK;h)li{Jv^epl}uLDc>}$lZ)^fe|;;R%IzbTR#o?QhcRHO#p#$%^A?&%nuazxSOYU@`F|MVCW3TMtsKl#vkw;!VnFMs zPP7-@^01m(B9hu^q{hRGRm=Ug&=3o3y0?hY9(e7CQqR6~lb;el(0CkuRcZO)-im450XHcXBTaNirKn8j^mhS6 zrJyiK!|JjKIW`&#d-Sg6fx~>?AOKs`48W&$HvF!6yEW5UJTP^9KABvSwK3Jv{1GNS zhq|4dE3iHiFb2`vM;P`Sba30n`z>|Ry2Ud_IFS>8;ln8qvO%F4B9%T4KXwFZvQSWL zA|*i8I8=(VkIB9j=VM@cEJbL?Za3J6cc7%+m3OaQAjigH72N72{n)cE&J=~DjUvMG z?7>PWQFLTsB@C$%=5$oxjA>yV|AS0vc~XCQjk4Z5M+c7bcvBQ*h$!Y8@!phdtN*h_ zCW&@XIk$&x!tW}BQ*)7vVsv}vh?i6{(&egX$Sy|0ziB(fY1Y)sxz{6y*J7F zNY@SU5VdQlPN*Y@(|e`vseFo^3BS*k85@BE;`1-Rq`bZna>P$*)}DWy?x<4?8>|R~m4TWfr&R;(wJ;VfCLSl$62}QDRCjo4o8z z9AgXm_QgmB5+~BcMNmFa*f@hCL9qC!Eiy29ue}DA|KL}vJ;9mxCKn~%`=`WnfzET<9N+m?` z$)9c4Q>vmAJ0)~m5mh>XDRcD%*aH?B%4SurgDX5q58g}bmBey(h)%Bd6-!w{`E(!*LP-OQd6svZ5XS1JW z%D>lwY^wjK0)xpAqvgl#`aX8lh%I+-a3}O6V>13@tU1IzX<85e9ix*(b<>ePjV6Y1gLDg^s+bS=chEF`NCsok-Y!(j=jiNBQ>prcZ zNzCPt-oi;`3ADUDx%cGCd@Lu=&hr6pXf9p(svSm=jc~RwD~%0$J#m@Yz>>b0Azt%Zxsz!v!jm&tQDeXUgLXkbN`^( z1t`-->c^$%2r&cowl7c+3l=!Kl_gdAD)apIoQ7iqBARG*;*Ro}B&MW?jtXRnOSA3} z3ZRydK}zgz}L5k7PjEa|4QwcxV}aznjK?`X%Y-S!Lhuo-j6`@g-59B?^PUi>yV zuqJ=+_E7F&>E&AsS#$$W-PptkM(hz9d`Ar}{fS`rFy(-^Cuv znADQS2o%}kxxEEW`i(Ol@ozQBF~%Srdl{fQHOE;X@J(3-fKY_mNZbiQ+Chj_Z_Q!h z(Q7wfazSLN&I|gxLwF}0sKME+B}zdEiz3!Y1AY7GveK;zMPKiRSOWzovr=L0BuBLn zR`sVuswxfiVb;aH%LBxWj=kQk{qs`kv@X2v=g!<)vG!KR0g08#RKjpghjLbU2t3=| z9yO5xKyA^j@)6x>8hNb_;n%OLS%?@@x5*mX^C6*vwsh4IkqHyRO?lE$T-KDJVEpJO z4C-|*Y29|*6fQg7F(fE7=qz~5j6zc4$SvQPTq8 z=jhr!vYwH~Xfa{7TTavF5<*v5z9ehysLQ=TT{sfsi3#@vGg<}+%k|(9r8YOG4WEvDP0<}5<2g+~~dak?~< zN!nP6*QQ~kFe4Sogbi+U;*pYnjVg5QE(B%Qj!Q8eu0;1PjtHM5mM@3njP8IEtfeo= zO9a))+GQjMTz2QMQgd0WdAFK>b%FNIO#J!4JoMH{KdvAs(+vm6GWi@tYx)2Rn4$mZ z$tHef$OTVgk>1GjcEfIWj8J@PKbE})PL8)SCXKjM{zzkPQl&HwO6vWlPSzC0)j-6E zb*7meC>Xmxxkw9)e0unjhFgtvuvz0#NVC3-ziO=}%_P%56(Nj`At@K!>yCrH6>I{a zD&>SPTIIn`j?^5=h2S^%N|lOZqTeiN6+&x-fH)%sMjxWPhp!eF4AYB^fH+Fx1-^Q|$cVfbNd-x-&tMX48C$FF#gcqtX9qFZem9D zj`^%Bk}gL!RMFK?PNo&y^(|r* z)@coX%l)y%4>cryi1A2@A(kA8pPQU-1!oVx%H){|7ku#)GTrs739~8 zruu0FxE$#je~_iHts)f{C4F>8C(88H z3}KE6VN7Pn@i8_QwNL+eEvkcjlBpqLFG3yvnv%uh>3cYvyMnC^3NO+n$pJ^>r9p(G>JxXH9Zd#q)6(FAAC|p&Jcw2KIdw#Xt&! zP8c~9e%b(|DN)JpLv%0DT->Xt64jLyDO78rUJ6!gq3)uiWVG^USin4D9s;3-C2kpk zTA3qL8KRhqKtLJcy276(#ps91`?5jREeYj6s3p6S1s!!fAC9z>DsNOg$qUxZ8hgVF(@5X8GI^^jnjb zL*V)~pn12jFf$c}R#Xq7#%wYl;Qt|b z6N~)X$ppY(1iVFXdlJNOc@o5$oA6DIdl=<$SLV|gFwAm%e?e#z-g{9a?a?5_svvw` zN>26i)pTvDD)m$l@WOXhICvp=3>kWmPH!mfJx6+a|6L-mD9C^tG5k>M918pYuD!Pm z70@xSQ;`F})(*NE?%~Gg!3ie`)Uq>G_EkTpO6i9W7n|JGpx}XFa^4v^WSvbkJRweo z@Dezgry^TYM-`4W{q*r*WP-u=KogGOS6(q)rZQcQ&8s{URkHy}IFB5zZB=QN=!sQH zZqM0PtFuO{J1YjfagEi2F==4*P@q{ybR@1UTui~dlF&R8Mf~dG6F^gHt!2Tw!v_|* zgyLLDDIYT(84em*su?o5NiR9Q{fmi#nkcX`_%v*J#P}y(Q}lll~JrAfj3Qk9nB~NFi7OJoa;4mGP zGa0Itc4_S6kBH5UW1a4UyvmI-Gb=9?`x%sx##QIo@gZPl>ihcojNgT`05yq+jFsg> z#LYK)g4_Omh4~0qd?v;J6kGNrI-Nv5RmoJIVM4mT%z_q(i!g zK)MztpVJsL?0h`5MV+h270g(qTMmSl{-Ae>eCk=LmfiHFlaaO)wFpqP{n1fw%b{Kw zH-K)OFtkOJt7(y`#2AfsLrumgN|gmD46zVuLm?k4Q25RiEom;G)0iJLBg0&K{Z%$K3V_nwu>0}Q*oyZuV>9d4MoRN{Rn>zo~Q2nkXRaJ zrR)0~LhMb70`zV98d`=DH0p_tebcrko~d|OZm-wuI@>w$c$o41N9+E5o6fc33h3?H z9{7hg(_ZgIIr_t|L(WGs`dhcyeEb+A-pP~fI4y#$^mq8+ED+OJzzpgjm9JuHIqw0w zT^bW@>dqd?B~F`C*q2ZBLqE;&8s3b-A7gMP1lQO*T&1Ua3OM@qL9(CLVNu>CcE?9s zNa6;LAwTIoqi?m1#hyr+i7l04>m=Ljnf>?;F&J}2*mzAhQ1=v!Xip;qFqz($=o}<9 z3N`k6SWWIaNM!%r!MybW`^NjpAm)B@@_*mK{Cg?F|KM_&PdP1XRRaf$zhJqbtAWEm zLvrPRbBRTmG!1?vx`K2hD;UPe*C^L0-`MG?^}iWLQE;Bijq0~*xtaoA={hp7^jL8i z5Z}M}CSH#LE320Ex3b585nzpIbUdLvsK`S077Pc!`N#kI5>rC zPhe}5f79e*r;blK%eE+P>bqr9U+h$-;fuv6pzEA{4UQ%D;_*x4~4Y$?F#gs6gxV;OqL(u8F6f1Lb*6PC|c>Sk;yx5mEb zaG~g8d}GkbD-Z_u&A6b8hMQTh*4wmDWp=^f#HavNRa)e@N~j}SD~p@2l~t+D*}Zd> zw->-JT4#P!M__Dj{qeKpP@t(uCRiGM;wg`mE_ZB%t$T7nD-kEIP5f8E|fdg0$edvEH9`Mnw9c4T2 zcOLtrk_~9GzcS*6?9v-wkn7wgVr*f7!ssl60tYnO$-#hxA+@lU|7jY<>cAKzq?J5H zPKTyB^J{jW@W^5kSCsk1tX$>H6)M3usE3%^;)`EKgdTgua+HafZ5p#t=>dM;C`Gow*$ z*ZoPm-i3u1MbKe5f1}!-9(y6p)Ko_|7Du}f(ob}{m^rV~3e;bG3vFwe^rK^8oIeW= zv0dyd)wfw06hy|ft32f&bbh6V$j`5HTvg)sZt5Zi^JLclaya#Moo@=n8*j#;K1Dbd z?+**(D;uP2X69<4TrqY*g)=06x=ELGE;>Z0i%_!QfFqcWVtyzr+`U^R(*DdrOLV&1 z#a#s9{2nm=a3PD?CY)w;TdA5Muw%VnpA1MjmDYRiuqX(pYpphh7Rs}?(29Kr!v$I^ zobQOX>DBL`b}Q}Hqr)eASNBT`>T=HxOAOj5N^oU<@I}BQz1Pg57(^UNR2`Oba2VW^ zCyiJx;RneXI}Lg{)!^-d>9lSa^qzh3-E-5=P9&3_ZAZIARe{Nz+18U4EbHEeGOTi$ z<;oPx3GR^OUcUO#FH!b#kG1BDWig*>GlgO`Wc~;eEJ}C?!_%19aI}HYtCJG=W>R|wXygSirv@OGMj zVizV`wMb<-(~{sJE(G+nSCtB84%WA*vFAS+V-=?-G4_@z&;rsEKu&N!Jg*YePzaAx zfPgxZ%I5AA23w_viCKS*Ra2{2E4&+l9(+t>t4=uyhY9$sV~h?p%N1jdOFuKKW3F32 z{nHOv6?GVtXxhm>*3gu#^1ZpyrE&HOsoof%>DTdX(G}A!+D9LhyX(TH1L6-e*U^ug z37+VBbhoK;-k-O4mA$8XJ-8*EZ`#AUDdapq_5FLT>KFYk^`D>wCR$9cG3ZMe@H!|x zuQTvEq)EX#V&Q!TX!Dtuxd!`P!3#IYVP7CD_LC~4y34rkbYuzImh8NXEisK


    &~ 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­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 AJFBh{cxAd(o4fC{0>CfP(d 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 L`;rDtEbaaW9Eha3 literal 0 HcmV?d00001 diff --git a/itemis.create.examples.sctunit.java/lib/byte-buddy-agent-1.12.19.jar b/itemis.create.examples.sctunit.java/lib/byte-buddy-agent-1.12.19.jar new file mode 100644 index 0000000000000000000000000000000000000000..d067982f828ca51ea1b4fdf7fc2c0dc9a605d82b GIT binary patch literal 256421 zcmb@t1C(UlmMxrBX;#{{ZQHhO+m5tt+o($0wr$(0%&eF9-hSQv_1}H_AKfp;h!`;< z=H6$VwdP)HuetV-mjVWX0s?{n0s@)O zW(NBX1hfGR1oZXmzrkb#WF@M3a?d?Dpv4JH^KQ>KxSrl(7;joY}&J3^?Rb zf+QE)B}nxb>ovUkhP$^V1W#$TRMw;nJ+?a1pShV*MNxL*y94jXGLi-h@WA%R4lrNj zZqk*wtiRJ~>F*=Wm5$vbC1TN!SS!dAj#sS$6!aPOgI%Nv$E>lyq|;#&k6=W{# zi%eM}ILK)jx~2w;j}pgv+{IT>9ggR9ukG0(T8TK}mux)SqJMAATQllZm2e~Y1c-IO zSIHi(AzBhh88Y}A%IMUdmt-Q@#dKIuz~G+Y<(i*W$>M)--a=^g(OFUjrx#>N37u1Jym+P!QyeCCNj zyUX`fMu7x&FIiZyJA;2-Z~I|&44TcH^Hkh{o9K>q^!H{Sf`^g{giym2*gbh5Csb^1Hc{&W0ac=oS& zj(;)&;gknqW$u!$w$$sRD~^>DWNl+TacLCKnRhVUvug6jR$Rm zeAM>Ig(rQfARGX2dYy8EYdA4!Roes5svIv+-M&wEC%LRS@2$VC3%--KE36g1JYB9| z=jb%xg?tXP*};YOYtOMd8M)bEZjE(%1VdljEqB`u7`hN`ZC2Z+Jdd|8igt8sMTSn= z5G*z0ExWP(xV~`^u-l|&dp4OZ1o%$v3d3B|UYvYsa*no?tg z4Szesp&5-2La84d_B!3sT7@m^%;X~7u=q4q_4)}wA1bTyjj~se2Rj%$w6p$=uOT

    54*4C9|F}C3Qy^0l%@`{V?|eMo6r}#KHAu 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 Z^5r*mq!T>x3E~a-RRm??4B!#O{{eu3hWh{j literal 0 HcmV?d00001 diff --git a/itemis.create.examples.sctunit.java/lib/mockito-core-4.10.0.jar b/itemis.create.examples.sctunit.java/lib/mockito-core-4.10.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..58b5f8441d1b658223675a0c362fa99d3034eb44 GIT binary patch literal 683220 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

    ;8)eK{DWp-dga^L`xbtTz736 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 pgR_LSr0} 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

    D1OT8r_=8(}77CMaX3qhH@Z&H99 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

    l($~mQT;i4=4*q?&QO(}L8$KhEiD`fE}cUPbjj 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 z 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 X(`Nul&A2q<(i}|tmF9g6G*I(@J(TvP literal 0 HcmV?d00001 diff --git a/itemis.create.examples.sctunit.java/lib/objenesis-3.3.jar b/itemis.create.examples.sctunit.java/lib/objenesis-3.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..d66019032bad56618c74a47e97c24e0ede75926b GIT binary patch literal 49423 zcmbTdWmH_-wk=Eu5TtLXsKXS6{8op`A-5nVx)luIz-Xe>L`$K=(h-Z?URBWoIF_w`rUDT3W zeya#n+7Id5fuK&$Gv+6@JBnV2$Ud>1ActP19!`!d0&JYYE8#bjh}+0?f*YMTiROs~V$x>^h#LF~BaKn|ke1`VtTc?2 ztDL(%NyW|Df$y@496k5no9pM>o@o*KciMC~(}}!KJyfAN#Nr}Lkbs{^k=*Tceya5& z{J^;W7!X6z-R;+(C-<9z?-OrnKxY|qu{3-wPmOF!4Mx4D9VNeYT}m3g!%Muu{ttZ; zQ-)5b!B*GIMrSv*0ay|MSpL|z+^sAjM>1+?N&N9K0jQ-1R+ykUY5@^MiK$gX-NL%Dd%R@GNH4vq*WPyg2vx5HcWxV3Aws z>V447cp;J+sag2aDBr5OVR=xuG&pQgZKd9>3)HmsDH3s{Cdf8e#M-|j1HfQben3gv zWZs;8s_q`&(E&ws+c@_)b{>J85}_9p*8{J)Ms z`i}@319Oly$id9vZ(?!(Db~!|!BOAZ(M;db#{O>x68`-_2Pf;l8BFx|gPk1BEdSp} z+k)&3|7JAt-{0Fn-@)wfhX0%YZDMHtH}|Ie`+MtKTiZD5JDS;8|J{<2{=179+1r>I z{mrky`lkyxINIwwf=t~0G3ZYk{R4JT#FP6TZ#3!y0|D{Rca{H7cu9aP-{zdb&{E&Q zAuU$R237H6|7+lKS5=KDb*-srscMI2&s-n6kbxEsb1oU3SvI3_7Oi#l8OLyTlziT) zaE@%)xHr`{9z)Yg@x^X!~-Ef zSFp3YZ#+NY&!FQwjm?`kLW)8em6=gFFOw8lw$-tw|722AXXFso1Ct*Ks!?Z@JGmCW z{?5(6%}K&GfmN)dz8c#ZEtw8XDPEN}vk0-$jJpFg$DksQ3pw~-KRGJFYG<6%8E+#a z`NS2waPXWBKAGum+m@?GeqNt=!qST!t(#RqX7lzSA$4)_ql~NkR_Xt74~jRT(q9X8 zk6C;zMk>yhumtdv+D51@5*u}z;|XupK%?_M_3E4auZWUjWd?uLgMj zEjQ9~2LB*n+B}Ag^iWpso7XYSN^XS&szirynW#jJyPSqdtkJg&SU1~_cam+C>78*e zNc9MMX1ixfo~vn29|U_?Fd$b5s#b^_r$)UJ7VK7ztEIi14*=-|PgpHE_gF}trT{{m zE=pMW>SXOEo0jV>K;CDf+aTz(r z2P7GSY00*YB%K9|+W$)e{DIwGO)7bzcMuTrZ}=tpC&2$7>?%7N{R!N-s7|>qfsf$V zyf_1BMHLk$MeB}tY`@6*{6x@V#E^lgjr5h@$rmVAdwcpXXGG8lI|5n8;-d?r{Hz|& zPp&g;3eqCS=UpHQsCX9aJ1b8~!tqH(KQtrV0;l$;5*~d!i|3jE&OAVPa0{iE9goLJ z=tcTnK`gav=QsIg-dN)dGAq9Lkj)N+E=AS@d4I-OmCW}vExk&mp3My;gx}_({0Ox3|ktZ3-CH$5Q`P{`Cu^i_n?fjc{yN3r-Lov z_5M2lcB~+wz_tkmXWQ|* zPP^JkGKrumo*_C{j!qaFD-J>Okk?xBfWIY2??rr+hvAqssK9hee(iePtK)@?O|BqKiUbtAsl&vRJ zgrLdDcWePrfT8z}Azwc#7E6X2By;o3geu6Pt80Cg-yC7;HCmwmX!s7hm|{s8*h%$K z%@9ZlHU@e8Bv~ybH=w`MPnxl)w#Qcs_7tPW?VYW~%wA;*jpq>3$l|+2WaaL21c8;V zr#EkBDF3>Yd0^ht()SP$G;fMq^q-dUFM8pRw6E-BtpqZ*1R4IZtYZ3xZ#u$F^1q3S zKUX?W%|{tc9i1-{DxM4h9g3z5zNU~kQ?ba3nVJJyxfdcX*RlAw$rs)3rOM$Gz37zsHl=9F>Y=)=dI^!4(B}QXKgS0k?jzkzUR>rn^$Du%ETV} z9aQbzn0rWR9P5$?X+&s5J@TlIDli73OElG%1)>Z4%5)_SQw!FDYGd`uLi#yO{&@pr zOkRH<8mSiRiTPaI=egWNlN5kGWN?*gE#ha}ypEB>xd$oo`W|{Ox8b^H^6!(5)8O6Y zO}EBH`tSEu)xtKyIE8r`?_e&4HgznTnxZ^hQH!fQ6A68LbJ9A-Z>+sV&|RG)>KsF00HjvMy%kzN$X zCP0+X$+Xv{*HPu?ub7|+bOarmwcLnrfz1?4M+6Vbz4D8fW>B56NB+jkItKT!-!11g_`!r0M>p3mcP#bHmX&2DE_drtXGacrw*S&%iU+I*N?Zy z9_v`DuhY*Y#%6hN4}%Of#%s=)8i8%8H2a+wQn}2OBSH-k4Wo+gVokFC1Tk{Sx(pl= zVI!y{?@S!taq7}i1gZXlMG9qL=Cq2rPI9L6WjW#6_Pcs*@RVpjz4UEn@=Y}g`AueP zyL02$RmP16WklECe1}*v%I?Hp7L})wRnrru@f#+7)~8y*=qx&=6%({a+Bzov z1~E&Dz_X6sN2HpfRG;%LVX%&Y8FuQCAr(Zy>IXdjw=LI{sO#gc0+%*RzKciKsK|Cm zV8wDp`}glPV1E^Pez-5P4Zat>$0JrPyatP8NjY2##fE?YjP>Sq zJu+Ayj?eXcK3u%JC4nVI>m>K2Nbs=#qF#y8>1BjrNi#sbpmfpb`vK*8OP})+m3h2U38+>{k`wMk zb3;Wr=-TK*>o=lDX<0QFpNVVXBnJ8tcRLBEcE%Ecin$Y$0Q3mYb z7+?Z@S+nM0G2Rb)GIPcG1Ycw*L|_WHXVr6|y9XQ)!frrXf5lr}TiZTGfzpBKw%)L7 zTg_z z5nR)ioyHHF_5pk*)UEKpkoAP&mEiYQoOC-qKEkiii!UEZx^?-){P6jqmgv`=MefLI6(o0+qxXTf5mWSk!lo9N|B z54(ZZ&3Pqne^U09Cyw@xjVmfxnGwW6w1r`C_lT?)Z)siL=G)U;+iP#dkW&9dZNWe{ zsLELOnb_l*r4d4W)pv_w*cLl{j+_rWXyD&@#Pu%0v^< zn#BenT;dMqUFAWQ0-Es_h3yVWSvzedskp7Xk#*a=FU+tTmy<9sE(Cy=R<+Sx;?A#P z&}RKQY<8mWrnGtbxLK4|^5F&6lK52Q$oh-LF?$j!=3VN)XGx@<^WJshag zF1hk@&tK!@uO@y*j0GJ#`tDhmG|n5`OIY54Pm!v0q6nAqxo4rIH1ro-j})-$UaC(4 zHZUfuKjEMskyl__`e0WxPV}$inL;3kYL+Qm1WK;Thvs~8E<#UGxUMU9?%_qt48lq^ zKSx~r((dnsN{^b`!C#*Vw@LP7HNsLL?`>lbZS?e#1MHl*Jz_#({@OzQtNIOm7=ZD6 zOLru1=}zh2!{T45UuBT}n<;DN{ts*CpCMDGW}&<+hR%lo^F2z^7Im79@q+|2(3WT- zUVIe?5;2$=(b??#HE~ZLCQ5XPIO=2IV{Mw5Y<`m2)u;BN>DzK60q-8Rv=NP^o7E?- zyOri<_uqHtJ`jmu46)Cc-5OmwaKrkg8xC-HWTjFKjGKZ$9fMkgMTXK~W=h>-eTjRL zFgad;;rj>c9tGHKX-lblsW3h1h3HCpeeo_*aNGNNs>@dL=}P=zRs3m#hNxBbbQ)?M z<`C-8&vT7OxsdQzfK|6LQ>q9HJ8;(A5<)uaJ|dW^)pH+pnfmVHY0>`te|FJmH& zv5{tTvv3}A2b+h+q2UN)94PvoShf`61okq6p_SErn0j`eyeQgUTeg7IJj;2BT^+-2 z`5z~0=qNiEQ2sy4VCZ<;13|tM^FJ7cUvV#3d(5ZFk!NFV(mJnP;|`vAWVahUe?F2$ zU_IhuMtm2!jL7EyqCBJvsXOkq&3;i2NWe|*xTECG>fadmgr&hcWkFTYDX38iOx1&j zmA8;=9i4~*66*mXG2tD;^AE)oX}dh*jKln|@-2!yMbUbb+-a34p`b|gyU9D>t42$RUTE*8F%7UbxeSeeNp!~Vp8S|4b<(7=Tu`|oIRD%cjBYm#%YVW zXaztw*C4v!EF~UM3-=PF0ZlAfz^?SEH``wndL6QpcDmrs!oNwqnx(cFnu*y>&R+9b z4{o@QFyS#$JFhTp*Oh$gilqQq7eQKS^R3bfwNm9k$&xiP>dKQHupoUMXb8J25(gzx zv1%`vonT?J-hYozb|mWNS@i!_&*zC6b}uqA~>6n(UwUfH$`IjW_Nz{%RV|Eey|ggSFx1FshB8G#4Vo^ zwhB9DTZ33Y_d0i+81kDWt=vJVDGUFpZdySU`vlkRkd<(-;tm&_US3A(NJ$GT?m_c| zHV7~44tDkZuNjF8cdSFMF2KY5= zfj4bXJjMLc*SGZja&-Ojbd+**0lFb`6`7}mzHZXvw1qqQB(R>u6%a(~}euWqxJs^7SPt>m4FzF8VPc zWUw_{Sq`#mmTqb$l7AtWg$kp1Jd0#WUyN5;3K{Ai`}CBy?6Nm9GOnlB{ywo=6R6Wb z*oU4k3@eN>ECZ}|{n#fwBAJ+QLG?yt@s&iI!TzG)OpB%Gvc8FgdL3ozWqV|=PF_UcR;ov=>}xu`+PC8L%N z6@T=+tko+0xoI59Ix}qW9(^3{a!YpTD-O`s*(pVz*+x|=q_(;sDYpo?pqEP;#^IpJ27*ux^$c4ZmG#AQth=yZID>A%xNV~j=2FRDq=aVin0^c zJJM-azs;5)>!gx%RVzKJodq4+hQ~AV^}B{?ZEWr>IGVl-Ze?xD(KM?728;Tmsq%i? zPJ7zoy8KXj+=uOWnNa&0(iDbwAStdE8tZAkq9 zgxLmb*I&hY2jGrLbu#&<3=b&X!hf(x5)QWQP-|Qwc=lgVD)+;Bl1xOtV-);0$5jR= zm7Z%vtxai^i4!CUc$cn5@3`%IYP^bB7SkZQ#3W{p&aZ&K$(Q;Z2I1vREI(oAyV3v5 z>DVTfMsn>Z1QiD)BOx)pQ2=IsWD#B+nWMfT^W+|Q*t^ZXiRHHH#YQBlb>bI&h)8B8Ke^j`H|0tNKzSX)M z{=*VewNghFMECB)!Zbze?OG%CcuzODhCmWNLp7sRWw_o4$}Y1?sBTtyEIA2vK1zLD zi#&2P5zr1Aa@gu#NopSVI!k+EdA@(x#r<}y5n%u|pIy_OwP}q0`;sY4%ie`2j7MoL zoFuRX?4g9owldFDrcV(<%sZhlbMb>XmeXpQk?Fc%ss!*}w15U^0Gh@O4R<;2D!XtB zW&2fSXloJIoX=Yy`~JmZ+OR>zc|~*Xiw~*gW|Hn)4PVA`+n`tfD2M0t5GMVZ+ql{O zE>I45Su?O69HLz1wYjuHb5;yw$Q`n|_eig8&>1ejFE^XFKU`M@pcsx*tsyYs*w)bT z7Hr}`;g`et+~yoUKq*;cUkWBjsXM!>HZ-=2XaCpU`Qhnxbbk0g)&21~c;?$Eltuak~-?H<1 zTiOzqRFyYAdbSC}kEd@32rg8)f}-X;8RL(-b}zR&0RSZ!4o++__gv=5MFZTMRSxNE zB=v5(?iqfENjAypp^rL>WlSbgmkYW!a#FbXc46j;)69|LD!FGne5Q$*Ak}_FylKTQ z!{jVURdsxMg}KU1LlkMipbxu$1bVvjhSX^%Tz(mv!I$j5GVJb;=~(`b5gSuy3>)+j zCV-^hku>2_E(T`Ycj`w-%f?$kHuV{L1|Hfd8cdHd$DsM+u5uRbwRzeJ8W?P_m&yES zmWuq5hB_Zrx_ZR2C;!>a#qA~X_RKN#f#V`U7^&dWkj4B15iWOvZZCT4Ea{JS!Rx_@ z_fZqn($SJu#ve}5tR8I>=YA*=i2JIw!gT;6euNG1TVm_waO!!78i6STtCtU!k4U%( ziGn_^!ja3@!5PESw}*R)zAhobuw*bdgez$0fN(dhn`qxP{p47sPNj&=Em7kAO_qZe zO zoOwqM5@(qU4AZl!55>ngOb&{~WY^a)qAV(C3x&o+Hxb+t1gqh30f%{CLlbpWH?L;* z&M1)QQ)MH6c(U8#+jPT;w#aqVSOx`UX(M(u;ai^BW{8ti1rSR1Cv-&#nsVk{L^~cE ziN&&N?c4Je70uH;XBCfRACo)%v;t=xMO=0L4Ox!Y$*x0zE0!{W#DdH@A;v*xIwSg&yF^4=eId^coUr+L-}~0;3N|4u$Fr%v(jaS zhC!z^(N4w^`;w!ad+plY0IALbc+Nx1eO{>E`J{*^=hZf@GY07&IKuKiL#ER}Gw_qV5*)&@Q<}b3=u#zGmD#ST_JhJc-AH zRaWGLE^DgHjM-e!kvne(C9)Fw#B3l8z0X}Ixe+7(6pbhtTkI)`JFYRnw*xkDYRvdkAaEp=lyQkEf|infH3OG^T!Zjz>`+tnM*;aS*==HL zYuITV0-9+d01g55(>Cx@V@6@3GFSf-7^ReI8Vjdwrm}c5xTBC>uWTvZW+9(W(r11V zr9s0}{{%NFSzn#C{JD)n_Ve^L2patC*EG_sD!<{kkKb`~iq(U{lvr&!toM;C)8eSJs38l9Fq^3Z%qy+a=WN)NZl~`O%6z$_?>Ek^ zY`0(z_YmzbGsf$y&ognurp?^e0-rY|H93xsz`UyQly-iZBKn<<4&Apt>eryg;81`R zOPf%Q&>5$rAA#51WRu7!Eyf3ng1$>!Li%yGtk~)vF~N@U8g`Mle1>;g@iVzwv7RK! zAUZOvX9Df`-6NK}EG3GS(BsdrL%DAD-H^N^* z>CW$%Eu8)V8FgmTC$X~5M3?nD-q53&)T8f5CatM@T0=Grz0AQCP-9M^Sy@1FI19Tl zL*IuF-os|c3O4sm=Te4|e5-JJlfXI%t>AI?pQ)Tu50jeS#$7`#o3dqHTAvRJB!O#PdqXCN4M!% z-H9X_vIiOF#1nw#np2v(xtiZ0Zq13;K6w^$bgS^pzS9Y7TEkF+I|RDlE8HxF=Pp|D zd;`rB8G~)>Kt=mQWne@6lnv2TR6VfJ-(MH*)%V8>&gOLmY+(MiBS|zcSGmL=RdWM> z3K_*K9Qf|%1@YK((B{-Rut=u8bMdp!-fqGLY-mvZoWB1r;_elZ*jH-rRReD2>#?s$ zEssHC`DLE-@ZcuL<)= zrVV+-a9P9{qTCZ-Lw=a8SQpuLC>$ljiHcKA1#;afE21PT`NP6A0t{<<4aq)QrN`6V zH4^E?4NB1J1!S1+dhl_17&W34LI8wf6Xj{su-E2SK!sq5nCri%U|$2v%+?~a>EuDU~#P?HxPL{yVS zj$ZtoEI_U_U(_)9cq!#e3Q(PLhEAr&KP2@!WDCa z->NH0|JPVL&2(KR$EBXNzwnabyNMr#{&bK=?Qo1BdYDCWyU!6&P6&PRQ# zMM@VKmeAsMGT@vJ(X`F$wOh7%fYfnX=GXVg=)C9*z4guB{aHrE`f7!|zj5h5wPbGK z_Vhc%5?s$P??C|V}6?R9L)XJ_> zjH2KZpXZOdj6QchxoE?NyZE)3FG9D9$=X-N^~s+ZQHFbOwe|(i?2T46ObNOatroZH zh6TP@MDp4-9Gk3Plv`6bQVF3jQ!U?_c~LKVTRFLExwIhX?8r{M3)D0Vv8cNd=t(SB z!^=7M=K><-AQV&CKLQm+b0!x=FSlJ2`p_Vr5LmoCAQ;7TeZ%)=%UQKx`MUXWa-a7~ zKF?mr2ce6pdWE1o;)9z)fYVajD zI=ghYMM51W}K4?mrI34;Bq8Q8{~1WX>1 z2|3sq-`-JsP?CW}tt5&PeYs(5zrVG$|5EAO1?IP~BvPc&?o_D5-Y4HTo8qA#8eMZq zNZu1u8t~B=oLbQwrlGgC0lh#XSPqrKcn0}k!`<^261I9Z2&Jh$MMf2!n`+;hW6IfF7o$O{bx7oAKhw( zj>?YqAbqQUmaep;$b$byXT0o`G{(3M z4nVZ23RDl^k$D#klWxN{5^r@QrhHaKO(h?BH(*uzLG0_ZD^blcRP|*@W$2B277#KO zf=_|W!g-qAuTH*lFdZPGMuTY5JXCHUcgzwFoLKzI(T@PB$1sQGe$%U~*nU6~GwnNR zp}Sna!>0v0uwTD7!5|~mvQe(2ON06CCD?J(YCL1A@-WK`v;ZC+d7SiGM zhJX0zlkSz>LLlw&u2SA}rV69_yb@R771_ho&#&hhR5I`xTWw$|_!5n62!bM>C<5o! zj+rR?(URJ-GE=r@ItGHsOm|yuHpxxYV)G;!eIfdc%`5c2UrikcgW36&5y>4E1u~fe zzh;-dY%IMV0p+xmVO;Wd6WdmJUCZN}o>C?1mg#s;@L#+mmwJXBORc0~$cLlLDrdQF z7eAPPqi7O5)@r+xkagwKg6qF>Uh;sfF5ngPA{_QVJ@ep!N*cdKn(x+~q*flz&VRV9 z{_1(-G#mUpEm5*$AF15suI%w$Z~aQkcKkQgFFf_BpN_mQlrZTA7bdVnu2Rq6vYvd1 z9zG*^a7+4?-4GV_h{ zLhghX5i3STy9>mvUW#|de3s+S`vfR@zGemd4%wt6ew6`^Ld&x+Q z#XX1EJcM7%J1^;XTol%cXyP4bmbqdRUPAFZ56UT}O!9kX1R5)er5jxLhe-9*NQorY z=|e_FiBRzNH!>*N2bL!wABH(^souum8>sU%29YhwF`#}_-OCm>jep6G=>!yeA)PxA zZnYjiul{HVM*g2Ppr=KT82zT$VvzrBTiu^DAOf-knY`5ytxZ&HL|tth|5f?9R{d0K zS`Ga*AU;2yNE3rH1=Y#itVrLNo4T8raSX0^@u<&{(ahb2NsG@lv6iY*xpn{I$HOs29AwX+2QXyY7^kGU4*+n_c>&zFL%v0j4B!-i{ zC@W)8Y^e$o0JG&-1c$S`E$}aY;FM-BRjqUAlU(bIqvLyH&EMt$=R?qhxt%I;3%sFz-__ zwaO<5sHc|!Wb^A`!Pg!Qdu!+lq!7Q$);M76mtj8yGtFOrbxHg%mvTe|(zZ_LR8pw; zrb+owC+-Qp^)i5h*O|ERQZH%i!z>xe{+iTx!Wypn;J@JEP*=?NMWIA)Ml=!9`wV!k zwRqztWKA|bNtCgj^9_NA2zzPsB-KJ^IQcg93unkOkEoM;M~>VzKG&ig2Qh5=R#F7b ze7g8=%WtF>dqF`#E{stLjk0i93UL?A`D7yoa$SgF(p;eqkP$VHWLri4 z@`9hD))E{bcdS&G{l7As8W-8t(<&$Tnb$%{7xQ_$gs~qHrKYNvp;o_NdH{N?Hc3-i6v>foQ9GV|=Bsp}Vfgt*C?E>MX-_SynGH z-1_zh^Bxa8zIWSh$Dih#N^yHB2I?ODoyFBa6_;}MC91R87QUmV;(#P;1p6%OX>05R zOZD&8SG-ZRd;l_=g;YzJ$JYdL2eyU1{2 zR?|A>Wza98G>snN!wK{bX`CVj6`{lVyShW!vFo}vpW+vaVy;nz<@Czb5@~G{5uhd` zIkL`6?E}ZBy!aqle?+}Lb6NOIM6Uj^o2rPg8(X{g$JO0Np%5x{M-n2bZ2rRu z3p&eS#S1ALLXC%qx4wEBCKP0sh>;qx28kddT2tq}Sj9 zB~z|?xL-CRoPFIDMD(pf=Tn$S{ZAZrWTN8~5%xyE=5v7u-6(jMeTkg6KZud;D!c9c z)cOVk!jM@brmxvI8_Mp#VGvesz1w3&V%_P8#kUGUR{r(1Nqau{5oMIx{!T>3UBG5a zIB)I!Biff8?&zX*TT6Xc!%Yl1wheO5$@btFf5w*x1bbJ60$rXL5u&YzK?~4ULR{ySk1AVkNRyTlerid4S zD~AM0+KpcNJx{^&TlUSF7zYHo_fn|Jb66wS~J_2@(iXYx>xKK_KI^M zY1=uex1$(u7$Q2ud}9CZ)-MGkQO~Wc2H`3d5t3hc==RJf7r+$Xz-Ka)z-Wi( zC~b!E(8+uZ>&aO@`A8lufjMlf*AIWyeva<=Am}&m+49YM=KJ4hKS4u7kb{GnfhFjl zMPHiovi0;^uTcs&dt($wtN?Z1gp!0390FVqxneFAsuDS8QP7~U-b5dreyD}|np55j z#H*jbz}9zhf_tj3Cos|Zs;a&5e9aEVdn2H``SbJ75WJmgm}aG*uN&5wca_!#-9295 z2k>>CH4B~UiI;Z|edLpH$*Eo5(Ja5;B+?ojIGf&UG8hSl#PPm^RCW+a`|QSzYWuf@ z*#WW=b4#V4ttqsh*Cqma9JyCsV+HxVpebTQbos2kPF5^g#VK4RK_C}@u0*Iwl|EHQ zK3Ox0m4jLvczY&Aa)-LkMl5gC2f?ew(R$#{xudgPohkmYrQp=GUy9QhE3E_kKYj%c@)!X7^oK z_I+XD&8V$#Y%4Gx_~FoB2e3dh1oV1D?r~vKWZVv% zlpYm;S2w*2HVWCfS(@XlT*AurCc#43rrqO5`${DIiYlq_gKaLVA11ysn9gj7a%><9 zbFlbZiHHJk0R3}6CLHZ#6YOoEZ?23st7IS1KucKTg;j8c8m+t=*6~b>1n>pG${n4fWF94=u@ki;N?|q(yw3{$Al%S~Tu%W0x zl-kEo3bFtkGYJ5NaZ?z`ZjroMi=cf#o+6owEV(e_x8hNn6?I;jsw8V#(i87nOVZW$ z{(c37@lR9{RuyO$-^9LE2;W3SrjoA=u%FMU8wh)N38*v_KC1utYC1@`J`WNTVy~ zqvpiWgsLGoHkffwJ|j(vg5`z9%|=zZV#5xWRDxwh&v^>CMBB|G^P(<&h+9^en#D}= zfgu&`EMx*;9eQf?;KzbiWK8=wFP>lTS;xv#=R_5_j(ghK)CMq&!nvMJ^jZ1lNrNp^ z<5^`>Q$LBj^vzlG8X`01mLa-DnDqCzDXGYv@$$!L?Xz#5e*pd$@NRkLjnR-{EcT#6#=eY(<1EYxVsG{D5 z^ap(e!wII!{D%1}XV1OkgOPsY>$tb)U;clb*CnlOo&Mv{{?9urPwmh1I)e>v{8uwq zYK>m>Ns0-MY&9(bOR21I7=>u1&c`Y;3k}$2JC|wAm*5OXJiYvB#Nm*}rJlctiLb-qv<5;O!xgqT`ka8|unW;r*5Ki@9 zsVU|-CQwbrh|{+FP%sAU?b*hdsJewo_sIhNEphYEa(Rf#dJN~*N6u=?bV_KFTA#`q z@)yCL6|~Ske&L=)aRC+f?t|=fF-hDj^nM%VdGyUcDq(wP@Vg~}`P=6C7N+GON)Gn^ zf!Zw@Xis1ftNP6CEtFh65hjou_E>N*u+FxtrF!vXBsF0}L1}#=#jbW`EL!an)m=Q! z;k}S^)Mt;ADd31+oEfqQZvWWd za&ZweiNpwRT{7G6zK4Xizn|AflSnIl-=9Lt__KwCP)k2-6ZHLs)Hp&J*Yy2zo#l5{ zSwvE7<4yNPsy!!7_xC&nIr_i_B*PEAOwPN8cwtz45?^~0AgOcsKi+~Wg%Gi@7q?Et zzFZcfUHteYrSBPB;vH+4to`-gwA*opv9I$CE0O2R4fG=tGPtAnl^y#7QjZ_w1VK#B zx(SzLf7Cn_!cSAJX7TlY++2JM-HPv_+AxPxQsk>6XsWgrr->$8^u>>Z!;iu?RfqpNG^vg|*iym1j(L?h>8+h%xIUikv+k;M= zy}g#H93UIohU!001~`{LieQjTaeNVcnr~qF85wcoQCB=!RwOctE^3PP_lJh?ImJ*ddCMeCt^8B2`uKiI)PKZBas5GJ_}@+EHV4vKZ9-7 zr!MiWK2JUJy?gm~>>9*NKr9wXB^VJSg@*5TT54PEq@$CyDVV`ZgPN28Lgc}rSoFj@yFejk%+lTO3QTg zeeTY_m9m6ckJk8h0QV^IOZ_{7=}Xq4SD{tqsbaQ5Cy$wYI8w1s5!g~t3Y64E0k}Al zvZzXv&eEN9?b7FOeTB?gvhG;(E$o9Nz5y7C`{&>YXu2xu9b?^d%Lu9&ABew_m8nvh z?H^t2kZ**=^S=?83idXxZf~B#zu>6tWNSD%j z;yw8#k^f|2vi2Oy+%2ai{ypbOTqszhFGA(#=8%N7 z{#RvjJgjI3;^F1>OA^NvVL`>ptmIB8Bg<(mcR3mlz1&YZp$Nmtn4h_RW;A(-KP^Pj z7GE-OUKpnvStGlskR_@V8@6Ef=LNyyNAep}p?JgH4>LlclMb0#_aOwA*aPK;FM!Zr^th zI9E&P^MrrE<{cpci<|Mv8B&H*0*abcrfir>)wu(o{c$ zxu~lfrc~N7$W~S8JQ2O8?_Bcu<-_1!tFM8&&Uh|HT;0N1{*-*eG~@e22`etzh68+N z*j5ZyMPg6N>B(b+glIDQn>2vDFZ>}XwsYm8YMi5*r2c6++%9xCyApPvZG#OgvN#oE zttYBb3s5S_9kEK3v-p}~chNMel=7g!cTQKc+3i0~n~L+PcB%}jyeMtyC*zwKQxa5u z%b+RpokOzV1%JOLyQwUS-FDF94l%ylqA`EroJz#ix%6LtH_87x?}?LT$dkjoyVuNj zC0ug1XJyj9$nG$Z*`<))dzfZX(XO$jA;YN+qV9>_w>DQ zpL4r!cfX(Z^ZdT;wdNXAV~)9y5{qG~(SS0v+#tXpQ|WZrOjh7`h4*JGEASsQK>V<> z?hh;bAK1fxq#)9UPJe)p{(qU{TAEMGel#|8=9ne!+0wn2>eWZ=g6m z90(AxlJWCds`-{%-hkMa!^W8`G%iC_8icSD(TIj{>+3a|Pw|+}^F4D#KHt3E)G?#o zr2dYhE*xxSQm(@t1Q^b&h=HqP9|{Xy$21}B$AJ&U%3nBK#=~~J? zfsQ|@OBdG1pyJKSJ=mpR&yAA7qA!oGi|^@akvZ%W9ZSiGdIX;IBOGgf(4kql!Z51h z`l;zfg58rC6i%U85M5B_MdQgGW5yiNSSxO^{%mbn*c7`9AN~&e!`fK?H<%{vU}5pE zzAjF|QUZ$)-jn4LG3-)H;WXqM3IWAJwrVC50lv47jg&aoXMZ1yG6_vKr{UG~UN0pc zl&4Id4m>4xw}c|GU?#jXqrIf0{l%o#=Ev7-v|sZJGz1Z&gmu9Sw0Z%V6OrP{q}^t- z9Qz3?u#HE}rIG!%t#gKnW{2N=bUS0jYhpsu1KrnPpw#Z{JGyBja>5`sV%cKoyS?+X z+lt-x|K{q-{^9EGoT)+U)BH9sxf-le%G(h8rxw`IDZBL)S>fFo8|Az2k4Ize1oy4= z_5|-xSj7Ziu=F(si%!gp;vV7=AiB=V9m{J3$e;mHY_pimbnaFU*8SI`wg;KsRncCs z3ha|&$bn8%w1$@UI|<7Ez{f;*8-gZ=_?lLt+?q{cGa(hnhe+D?VtWzV(Z(HJ{^atv z`V3l`fF>`YR=W?9_tH_z`vwkP?JEN|Cs|g|w^&_U`w+l0QfU-{PN_qsFZL_$4arn{ zG|};I-a64qvf!TvX=pqhWrKtI$!odDD>*=#kw}%nV8{$G`SMUUvoyRRnw33Niu%}K znwWZ@S#Ql4LL=L|SLNbJLbpO`w&Ab#djasn>9%EZ#(PQ^fNWEc=v zAQF(6h~!I#F_FQ+G(nSoUo-~-43Lh*izQiN=qi#HN5(#P!WGcWn$?l#t&Q({jIllT&wD*0c4R+{bU-0tT7XuQ zW({B@#*`CvJqo+y!BlZ#^iusA(TqxCuvy|=>&OZsU4XsVIZj#l7-ZWBxHabQ!?$nQ_bgU-FH7*&n$(=KOd;5-z?JU!g+ti?`tr8^3}vXWwceMdHXQi)99Sf#=pM)UaXGmruk`mgZdeSNX&hWuXo?nhesQp(AikI^WK_Z~%Nhq9k@X?H zo=TF=QzU@Bh71m^pv+Ejw{#?OoB%hGzLy`F;~8AL&eD@Kca7TgHC#T3PkieoTK0Ax zF)JhfrseS_P145mMb>-h!@H-~`^+^ZVj=?DEm+9i2(xW8PQHzr58xA{_n2REz@Jf& zw27R=G@b?Cc^OMmestu)l|}fZU^swt8!}1-B+$O7M-b9R$autwYV>iYW{9 zJIVKU!Q)O>+%B6CK9|q46$+M|;9O8m2BUiVvr@MN>1Zs3;KEoBURh$`@>L_);#B*!@ytey%0AwG2)k5|3b)s$wxu(8?#gX;M!faZiR!=D1=w;{8A^1fFm6hO1`f}Xq5IgZO{ zLjm^i9n0mIKuxI)2C?@W?CIbVNbB(p^zlfwHx_$Rj3;l~!C=k68O*DChERjXS&ncn z`OlwXqiRG!rfAUNBI$Q?NXE6c!)Pa%qR?%*tn+A5nk-b0!7|;I0!NIH1PrmYKRxQV6pLjg-2}2{ z1hn%Rk0dDG?&uDdG}5l`>K#xIZK86hRR( zzZ)YEG(6oE-Lh=bx0mvp4QMo}oTmJIip{0K-Yag7C@#;OMpSJArE!CaB65Ns&9mae zJGN@PD`(hRg~gUPM9;|9EtR&b4DCDHBf-!ZWjHG~QCF#qQOBxwnh*@xn~P^qZ>$Z< zU|?D2-#VX9`b6iQ?LL(4oO;dIw$H$_Ay%_NVX@11)lYNkuq$xTKOLLL#v!Ru ziMt(yBLXtM5m0lMRSu5b6H$>-jLOLu0wSE;Un^0A6cr)$zq)(?Vg)~Wm*w*t9`JgXbb3-xhdLmO991b9$rxHdu?5NaZMSg=>6PZyilvtj+W&3N^9a8xarA-@{Yw`EeAesaO=nw6Sn#*t}%#~?~DMu z|5{L5Wk5=|8q>i*b(!g%B$@9sSzx-Bg$M*u~+N7cz0xvGekBpQxWi zz9Zc%BdF<$u687P+kzs2$4oAS(Xz-nyT`T{VhR`^$ZOgwv;PF;kk|QfjB5%Y)2dn+ zzSC66i=f()C?n8NBLp3*xHeY$D9x}JGn@37HDPw;mtp&yPpY|5K7%c#Ps`9P5P>4s z1YHcv=tiP&oVN?tnrJ1WVQi6fT`)LqWIQJgIpczCvyNgpg{M@fJU7qNas*|suQC1aezkk<@Sn2m>%vn;Dne*%|c*26a z|4z0Vz92)YrW0K-9^#T zjkT}kc*cdhI85C6>>U5i>MP#tL63ns@y~|k>|nddTnE9?^lj>)b~SlMq0p4TS()!4 zN)c8!JSI~$BK6m)?=`~F9z_^mc-~YPv1ZAtT`d@}LZm#yaq2H89Q;#q+M>d9e<@e7 zWI8{$biIJ3!!!~yYnQkGxZ3;cFyTzEZ#~He+ll(a@ACb7pZhoQJP`r$|B05WsG%^; zi~NSFPDr8|8?vG(%S#(i?gLFjjxSo-0XU`e<)+c4>0~-2rU>-vYR?MI%Fb?k&c+@m z%|%s5$HuENzE8Dow_8rtX>Wh~L>C?hiAjg)4Q#G0=;vw-9o%ix>_d?hy!Zr1H@M(LVt$V6wJG>eH8_8#L?g7{Yl)6T_quT{kugdxn0cDGO}D={8K1 zUXm8Bu6Oh&(d?cD4Bs~FVysl-&}5&RjqfEW_*f@;~=T4upQzT;0Ejo%vlsaYh^pzM?j({sY?K0tnH&>bR$c-cWqy9 zp~oK!Wi>Fmd=gNmwGH|sv1g@ zp{QUHN}Qb~!NN?12eHH0drF+Wp9Q85pD0unF98zJh?Mb{shN%Z`sl9G;Ps9zRQx&D z!~!Qg+PK{d?f22TN2wCVPwI%IQV_ti&nYSSEJycs(o zXO24-0b{5kgmOs+Q}3`1hvi3$JN#WXA7hNB&jq?@>d_THUB1yF*1b~WCQAWpjob5} zCBMeMqkS7zLh~%Y?d(4IiwAfPK&@D-hk&4 ztQlnGZWkXYIyc>_`y~A34FBmbUFYp#3h%p*lsxI9E6DV}dV~K(hV+kKpe5SUmFGY= zM4+BT+-D!?QWKY8ipUAzmscigeYJ%%mS&AeylpR8J-W$)^;fw*j^^ChI^pFUH{&xd zyR$|o+;&f|SCAj5(r@$BGTpS)wv$K5p-Pf{wM~1LDtJHE+l!GeNo= zopHei`MO5%Y2xa|o-7H~xE+RxAaC0}^0)u&e0NW#kVtz+jb&yq3wju$8 zP<{^-@7enz^6$x}vL!UzHn+|(Xe;8##27D8gOZ+Ci$LOAHi9+{P0o!2O4ED;bqI{I0B-B*DQHoXd(VKi?&8VzDbq^@n z2+RwGA5$oy)MVvPNyB1;wTIwrBw2_J%2>u2va&|e;)n|^3x zyqRHhun#z#aa~uOn6^owx4_OB2wtO|!0(y)8xSL>**&WSZ4wZAIUMBF8 z`f*hgb(*z^RV8Hrid6aSM~2BvsMQm=*16ULJrEc3){XooYupfOpj%uLbY9PQcLBZ^ zxN5;_Y7bK{@yN||!)Ne>$#-Zv(Qc|AfWwMojqKLec_wb8f!|r?3jNY0+pXbz z$(9p;S@@XnCIVU<`5E-j`J;@)?|#~kV#D9cTY~@Rcf_x2XGkpQU}@>{pOeO1xnb$g z^vGQP-jg6go%>_{m=2r7N74eJ4+H3gFo0(UmIbKk=sNwIYR#mE3(yzxZ5-t8uCPie zw{f=n$(Wnh?OWIm1Z7a<%7g4p{h&;D!Z>>=;MSN`M5p;7N2jd01c_Bu&9@Pnb2zcW zdWVq!E-QnvcA@cAiD6l`@u{1_Dsq>lIV1QZPr}%WDWJSse_YIp zDbm+1;ubS45rrj;dObU{4SE5aOZ1Sa7$4+#(-L#r+cKgj^Yd1tIDp4 zmkdzgt-Ch4!$KxOWylPng%i|o$wj{4GMd0{KkuZ44OulNOsx?DO} ztd1<&O!7mSQwAJHiUVLsPIoehMrEEd6%=n!vsn&*l^_fvvE~DhHq8dd@8#9DSXx40;0@yodx>sYkt0Pm%{&azGSTD!TnVt+ zbXBWCM{Ln*F_XH8!HGVHX_C^%AOs0>B%zIsF9j={u40t-$09;}}lo+cTwbYneer2>_@1d{NozPu>9N4iTt zMNv={T@`-1S3kArpoQ#vE`{B%LMp8*`NQZP1qyq?&F{0qGkf>f_tohh1nU74Id&UdlBfEsrgM7MhYx3-raH8&sumDjiPB|`~WNGzv$QLxTzVBa` zzJKdQu=zR>5o$)eR*T_~qX|c$8v<=DPwi@9F>WtI=Jj&1*x( zr1;gP^ka7C5*5@MKhVsY{sH&th{IqF|C#Y8+!|3m`{P%gm)B%d2wh!ZW{iW08*@;q z(Zh5OsN|HZH*%g0>NGvKZ%AS7$ zPq&lxpEd`t+c!JTzds}ci8a!NKC3*Y>X*0()AUV75aUJlyWp>pOldCoOF2}=Xf5V3 z^R=NhpC_n}ORDrBRr+=O`mGoY3^XMk3Xf5|nxqaM<#-En4-{YRl0GyxT{2MBW1&Gm4I96ZJny){40^3L(BwzXM1#b9HU}_SEkcsIy zIWiikl#(&%y+d&<7&sK%F{*-TU?#`a*L_F$Fixa{H$tqgVq|9ZRu4c zNNmtiuvI6j$8JX^97u?47$`7IW2MZWuKGxNeM<6Kt!!3C1b32tL_~Gs4a{Jq#dZTH zr#(2^u%NJ+6M85m1{qzJQt>b-A-3<41o&PU3`;k8>XmiEdF#zCI%SXkiU zO)k~8WspJOezCaGl)SGIuq@oMH4oNxYw|91u{es~qxe*WwEm?fQ-@Zh@blxO`#*~0 z%>Vn-R&=qkwy-vK`45m(u#}mWMdwOzFlS}g?n7s|gq5qyoY|C(LFi&Is#4_;fH8XN zj8!uhGnHD7ihRg6Al75T7grG&QG~EFUMOa zE`L1@l-r!+01ET1(%(z=(yx|f1+<+y7WYcj3>9ei+t*31@8N)3ewkmXZ8*AM07g|`VQk^_+ldL) z$#OEQhp;>H%Qv|{RUCz5e3`v|TVE`it!2=9rFZ4ItTm+t#ZN{5;rJ^CyZ_2vI~X~# z2Sw7CK*l0IvRo1Ggb^5y@GKa*Nx3MvGc5N4D1+UiLJxLSz{tD-yVQr|^gNJ!aj3cy zL$=y5+R3*g9Hxpz$cBTLfMFC7#eN~v>anE7v6CCY5p9sT6C4o1^!v7r<>x3Iio?e) z$UsOzK-i5CwT&PqVnB=#C3neDshVN+L*qbS)w=)r=59HNTliL>!na){QXtg=*A$aj zrgdK~i)bJ!8AR)0DNdiOb}*OrJ3&|(n&863+=vB$t^z4#`5gWHL9)Pf#mv9y z_0?Xg`;dFPcbCo_Eka%?e&NzJ1DI>+rl_ZJMB5k3Oh|VK$gh(#g+H2~foVFlE+|ul zt7U0QyTwkepvVpdR^X`uUwR1x>8Odll9a6L&6fqWFhMB=4Dt*c-;dbNdlA0|1Ey&f zl~(RxDbD7WHHcO`%)+hBm-TA_pTkh>aYfGP%eY@nPk#Z&qunc@~o%w_Z&U{ryV_w5&(PJ@{?s>mRXdCt*X zFvN{`-oc`v&S&Z);!=zzmm0<;G6~}!czVvjIYkT2J_mJ1P>2yiiD#z0NTTw<7gQws z&nxmo3FKZqJsdlx5-daOp6?H#gJ_L27^&sE_d7A64l1G;3&hIa^5oHaP%z~BIJ4iC zJ%0zdR0%hh=toI24WL!z+MR&w4%;dRWr%)PRqHhalp)yIZQT7O$4-N)x-I%JOTdR$ zWBm8#`H!yB|F>x44}|5owVvk&2M0$2$8`j!bp*E(20v?=`8nRQ72VUaqbLlH04tSI z(o-e)n%dK1@9~~fGP8qdE(|`lF>=$=6Fo)v8&Mf{G!p)IB2X$2B~P8hVyV&RS|TJ` zVU@w|*HbS+7d(dq1Cqp5$PKS6I)?pq$kgq%ca=+FZ&L45k|^a3Ju^K6Qe`-4h*WE_r!*V(E@Z8Oz5hLg%nB^_lWIx!>V$dlmebIg>FRm2 zK_tB5YbndjOrM(0&X!4_68QVV+l-HrQ|=t>8-AQ~Z}w(Mk>wXP*2UyXcny5aE*WAv zj(n62X+_Z`nY<;ekRG$N2&>vsbq}#-eYI983Ytl+x7aikMlEOQd)#a=9PYz{{T5SC zW2Zm++y0h2fy4k4GBCa8e4jnf!TwOIO+t_W2 zV4Aft8?O*|K+&vBQ(D?LX&lwB9O_FvqSL`^OqBbsM5?KPpcR>6_dp%?U~ zttEa3J|H))7hP@fuCq{rKMtzKpBDMB-wl^uQ)yI7vet+{N0})6XgzWil?5)!Sj+hhg?hy2eplyxk0ZHzI}OJC;TfxBXr@*lr|ywR7;Xk9;-QI ze-K9)9Ov`kr()iM8LKZ{rf=-{r$aY4^qvC)nv^w&=2hetH@B^Lf!o~wz)Qid4dmp>DWV<;eSzeaHzy{0@aAEA} zD>ptX@_Z?ybs*nJG5!>L%Oyfgb?MCLiDg1**FF$jw~5 zV^a!r`i0BAWz;yy|Z#rZ|a=cm^r5aKY%)&YO-!)OcV80X)XPKHiBm#7o=(>|7P23>f zt_WLvjwov+67bqv$rH|#FuHaG;_pO^GT7WQxW--Xxyigad%pMVK}?{0XT%j z%Ltl`MmOv+QR@@`lCiD*<#k|4HLens@7qs?xn_DA{cMQt1?077!ZR2Q4Th^#@_`5W zzPiwI19zHia)OhV?-L|~b}};p%t~^jKg|lWl#8zsU9W@}71NTX-fgPAGG!BW3}k0! zG7LwHvXhhB$~fGV#k%}?D@xCm?MKC2xM|UA9Mf&|2Db>C^Vs6kcB4BxqDu}B3|EaT z=6!TA$Flq~ondtJQZ6KvgKS>ex@TC;o;jMdWSuBegLbK8Tk5ep{P zyoQ;=gz!y=M}uDwwe~^7clVP$H_+q7bad9_YV(heyhDb=qb4w9=y!q!mQ9C{;6i^ujYY zO(?&cZz;rj754>scq|uS#*$km$7e&|E-&5BV zSUR;ut_|eWGeDDG@OE-E6kO;vWd6WbL3R&LfnMu%Lj+IGjlPuaBy!K*pl{oqG@C|1 zEMr2nObdst?lx>uw_b2Ip8tlLI*O2_^VylSmpad4b|W--_dE@(yRs@D1)PBN!rj z-;d;>G8?|HWxqR4ID=uX3@MnoP_4O=;?_ymwqkT8t2+>DTE=8qzL?NeR2XZF_mpmG zHTrM88qRrV8QGU+Ex8_kxwW!E!RnRuo`d> z_$7Xa#MaqbH-MnMPV4vHPW%q2(S0Jl;P$|~IAybhI5oLq&e_>PV2`$jXXj7MyN1-_ znMCVS;trS`+z-&i6M;iS=S3t++zGvCWIGW1bT*(b%JM*Z+&1jcMiHK8JDUIK-3&je zFsSmy#lK?a5o$LfNbfl^(xQS+g5Hj%z2sc-%`x2hwO6(z!-hxy zm&IhQ!2^2b&Mlcfrl61->pm-w7b8cP>bIq0cmKYnT&GZ0fEFf2$h5_;5vS&~Lrm|dY+>FQ8XP`E4pcm#h2ZiS<>%_$sVDLF}B}6M@_L*hreo2Q{ww@i;@r6T${2MOV<~ zn;-6o|6^i8^SI)QwUBx*KRP9Q#zXS2vSS88yUBcD#!J6)sZz*J2f?^mrGhoX7aSl^4}8xWly4xygspx|VL ztQpAsI}|Oct3-*kCp^?D*uv6HYXQu1^*3>HrFgR3jD=R)y#El3mnMWqTa|K~^3uiU zF%Jzyj&Q4_(36Pzlg=q8AuExEX3$!)iU)@`^ALM|V+MLsdvDJ80o8`l(;Bw>} z=8IFD*qn@OB{^l%GsfE@>31}bt^|WZ=aS!SsQKU0OCZUX7vNv}u~}+*vJblq^gEJ- zC)F%mNb@fd$26FmiT4}^A7;C{v9VUwj|feYiD)e;_I#05+iM+keWky#Wm^ zXC3ADaE*@z@dPhm6R$eVg+)8#wj1mMnu(Bt%(eLT2Zt&lh{!XsJ2{*aJhhLefdrJv zQIv6lwMQ__Qw!fr?Gp5fXTe5|vLCacIpyeP4ra?{>iiGuOL#+mfU;XttXpo(E}?ne z(TwE!Ouo;SL%ZrQ6GNA^F0SToyif=f;ls!1;}V(&d_8|E2dxXXQqG&hwBD)StD8U1 zs?gPt+3nrdCZ}N!sqNKn$1%s=t`(jvM3b(_QNqdd3=UB^ZBAU{l4D@fh=rTBD2DDg zr(JEe^{t$Bj?!A{{zlKp`$>*XctvNAtO@GX-8kYWUYtNLGw&)su)qyYHu~iRoWdj0 z8H9wsDk86E9P)$+-7>uHivzH3`o)CE$@VM}_BHI&*_gh5D25wZnZnZOY&9lV)sa&v zZ=KIOqF_vLj`;WBU@R}99KDu;Eu#YIV;W2u_(%ytPyC=MUFyr!7cP;=cE<=jiYR29 z-^XggRg8p-wtPcX_A~P)9$duvtF?(a2FZrcJyM!JxHd5_fs-T-+R+S|10T8=#M36; zSE{}J4lVVM5TR&PrNnFJx$(#FA?|A`J1`+Z8z8i#=``XwP-ulC#Q|ZnS~>!PEGJo} zdv>T=)UvFD=e-`$iQN24Leee3<6?d8u3OnH=$R-fMvlg@jj!`8TTR0{;uUw*e~scS z8P^@MKDt1UA6=mTWBN(=Uqo^Lp`;T}Or4YRxl)QkPorkaAj+!P5)9Fls74)%PYj6R zo@BeI*NJJT9bZg>GHhD%J5d;%1SO+DRZ1V*NofVETM5Om@If)Tq)=7GR;L#f zC4)i~Tn5hHr*MeqdVoniZ<=XNJ?|V1C3OBIPaoVe;z_f;O|cwJ#gu6?kgT=?U}3KC z<=IN0Q!=5D%+mylijELxR79dqAEFp~Y!`wP)e+Ko)N*1~u-8$r)}w-~rKxc~i&(>! zrn*+&wQi-q%b>#g8CsdLY@TVQRiq1{?G&qS8zK*B!Dz!3c*w*#Z-u^V(&nwT z7{Ktf$zEuxZW$Rn5NEj_Lv_(s6C>c5Zn9oRMy!A8VA%F(z@ql>Vb6Y8Fa zeD-Mf$koM7s~f;QZ}WAZnR){hcDkY9M^y$s3LLY$H!SSOIv{6r(K}?#!`@1Vs-r|v zW2I<>^t#or)d8o!QJuRue?;8O#sg{G3pc4OVm9ZS631xw6LhGGtx7FVMT8~{D{u1R z%70vX#Rd2XYCCq{v@4P70G8Q);xW1mKX&T97|Al#L`BCRLO|~YXwuJkHZ51Qoj1yS zOl^j7^zNynDG%QWZhzTswX)mmcTDD**t$Qhc^iHpB-e<)=q@7LdYSjf8M(BS@mBIf zC{uOS+LVY9aobRM-vPV-MOs;%6UJ$ClFKp_{q-ID?BIK)qlo{ z-^#ps(4xpObW*=yoU&ct-D#6#%Ik`gzg=IDgg%`_`9~C@@0+###VEohr>%q=moVj} zDNayN!aghXu3KD`5Trwn;q;U^;ft6Vo6d0hpxKv%MJWSDM0McAnAO3czU09;3o$2` zA6a)2NyVUZdT`+gJx2%5n8Zj2gP{;Vjl;&Cs8DRK1pUR=hI8TuL4Y;FeD~syf{l!1 z8I*Q7Fz&9>zYe_R=8`{(f7IM8K1#!6{}KiLtD-=b(4r#p3&;4Wb|lbhRD5C0`0;&48+k3J~{&~jKGvheU$=^ zH5_@;eSa=)3p7ql_ihnlvZrUcYszP5k zA@jz#5YP*j3R6}%&>dX=JKhD1=_D=UjV#lNA4=jzs;>87`vB2zxQ1OQl@MRc4Wb#3 zh(-9tq3b71$~?^@jO5aBvmHAz?)a3XN92Cd7nY*v3KseynZc;2uqss| zD&TDp>HS}-^r@d;C}uydq4(oTaQ^%2_#@Dai;#luqJ#Hee^7a!j3a}$*GJG)v(3bZ z|bvFU@niW#zas|24A;)!V=o4{O|JE3BGv8eqERGB$IVk}~nN!86CK z(;m55qw7S)5gEeKATXLL(;}*h({~CPbnT^n#Ooy>NLEYad0`(0A^DtjHNhj&0G>T# z#3^OsNxMW4eqe6^FS|4mSKtiv6L#WXsvkZFXutogI)dh;hZ!+#NPgudi5c_ z@Wgyr5jKXZ2zjWBI!A6y}VhY_cmG@LG54@hoo@qpNFR7{asb8n=wXCAXW7 zhQqa^RwH+V-I=$3MnWmDR48ZgDxygbaLD6zEM)?I#TrL}orAi1FYGW+f@Uo*vj=K1RPQ+fagqfhz)%3SHpn*Gdi z>Pk{&#(i@EbFKRsu!M*ZaL(2yXXg%k{2TQ5j#+$btmfPW7_NzPAS^qk0@5^e+sp+@ zn-MxBB67Hus^VbL1K*r*ClPGKC9J?ntf0gS(jH$^ZIcXzs(UjR1qLPwF47F5 z^yVz}{6}NRYl8cyRPm1u(;OAn0ui_d$g~m352w<}tJ&o$PnZ4XKpw5c z8?e#8iaJ+R24q$|rFxW#f@&l0%f~-z zk)K)R%Tv?LvyInYWuu(pG{op8YmlfWmKW7W389P3oNEYW7_EyEz`4I9f_{J!dXeyeT$9 z?BBduFY6M7%sTm9uScNpF)c?$Sloy*=#n^(0DgYC=U~`Q?RU4o?(jL&$9;fEag$Bk zuEeKF;0=ix_s?D7^>Z3~jgKOT(nkrG^I!bUKhNVI?*A{-%zwdIWi4Qz72rwcplKd(@R8|o%5c7l> zj|CKOK6W@IOnUb-EFm0!5m*TzV?b2BAfTB3PLfMTI2eyCq%|fTZs5gS2j9f$)Hln2LyeK+Wjg@0c z(%BoqDwVxAL~eiD3010udBR4kUVjRxkq%74=%XbUUz%899$rhHP4gKYrmdF*(?>UM z*zzAKjcE#+6`w%fk^2FeN-BvXF^LAYnoTf3FEI7<`iDFB>ATGP9qNoDaTi3J6nF1=`Bl~tc{203}R`~|k) z8KnF1YS1&ZrXo7O)KTO-w)Xcz;l?fb-%WK&8RiJRECSVL>?j|ryhemPM)7ggpHr3b zU(dv}{mRl~zHXNoSzJqjaa6o}1kN6`NI53cPWkaNhSc?jm^Cc1eyp#Np#=k^e?wtG z_mLup`aLGHB~`FAHQ5WIx?s z<2fB=TVBetvm5iT<)57ys(}juI0=tw!)FJ;sigX1wKLpC| zj1c;n6ReiM&0TubwDz15)qKOt^nIJU0&&kdy%~OPsDa!4lmK@zhgUwid%h+zE}?n# z3^&;vuqmLq*xg}%^Z0yEUjeZT={vj)f$r+ySIpmVC+^%TrR~<>80f?~;GpZ0fDb~j za)E#D0?)99+@z6yc2{Yoda&lzE#_VC5(1kUvJ`O8L%eGk+((deK(vR^H39GKt+o)j z#WAw&)^h>6^$^u2=GpbxQ+P>2-isNbmKf?#|A|`f;fC0o-!3BOnRqxB^F7jfV179S zLVF4?+Hfky$LlXV;$dm}m-7#>3jP4`f8}HS6SV$D82&dvE-NJgN{^g6Z{_4rT6ecK z=*!B}f$v=HEDP@^1Q)lqUZyLhh9oNAnXxN&@%NE<>v`N$zRv$3;}=HVqV0~22b>$y6kL`s)6y&5 zc^en=zpyp5+!q?_{+jg>y@9a7euUNhA2pwU9sB<02`YTx{hyWd{*3r>v47_P^}h?4 z2gLjQ3jC!^OBsu*3g5!Vm&wmBUr-4Pb!plRINfSmwy4L)>y`N(kz7EG`EA^j{Px7r zw4Ua-$3p5NZbj>OmUKw9sl8D$s>$ zS)>J)Mhf6(9u?JgO`zQ-k})?bswc1LUXX=x1v{|i9_cl|P?C+5q)v-Yr!XL^Ek{Ys zzB$E(w#mt)S`sNJLu+(VqPrcJqsY}L3gnk~7XOY%-%|i4C4{bcPY8+8i20Ff5PDG? zDsq(vN$JHoNW=xPY+FUysoox7xF$DXJRNU_hvffy4eJZCa2zZXFz$%u7Jg%niS4;W#7;|IfUgm0t@N4MfRIFvV z!S-^prv(?cth_>-zeC0+LAX5QI`*&YRiW!!GDGE9P%1N*66oCDZpRkHx(~Ybj~c;$ z(WU=j4z;?G4fMJ}?-u1UezI3$uBQZk6Xs$qf4}sY5=nZzOPh*rmDah7|bGp$eqmZS- zrc#k!jW{jk_|W3kiB^kJ=|R~C#TJA-!mb+2yfcJ&k}FsXTGWc zwH6Q4vxh5HNk@ZUHH%L?zPiomMkp>4*>AZzYS<0oej2vv(Omg%nx8s*qx0v$%3KxX z&iW&$f<*kUwwe9&g~?jz+8bH_v=lV7)BkB|V{dA0^+(bgrsCp^Y>eYcHvcj1?km** z*DVKtvG`pxBmR5Gk7SV4K!7rEV$i4xW8s9lI>x3Z4tH&Cc}`vfr8d{B1l}Urho**7 zxnK@=$#s3d{cU)A``Lq|d6Bq=X}tPctNr>FXFXx~o#P(+SIPw*N{0NUDc;ou25bh( z_I_~Y#x-Uee&07UXW39V(}!quyg3{G&bAVi95}2?hssA- zJf8KLiv~EEjo1ZG`R@9j2g}RH@b9>nx;SlA1sPKpT(J4Qdl;7(vo>=9=i8`khuspLi zYBt&k83~Fnl6-G<7qnn+b)bC}a#*a0l}mxgszD2+V7XzAgu9qf_5FcxNtm8xysK-I zIEN<(a~BM1M9p2$?ovim^w~i3JBq}0=2)9jzUqE)wN~3|?x+f_?pkt@&Qxri7|xk& zM|+ll4`VcY@b~c<+ba`>J%tWVK3aC=FNHP|VNbylpvmleI+GP~_L8wv@grisuaTiu zq~+g?{|aWvHM*G>UN)GWbp!lt2@%wFdpZg|blfeag_D^lMoA)w&L8!f1UgQRdm<-W zRodnfU6VB~DTGrze-esi)qV<~EGSZQpn-(JJmrpAS}O6wz{NaaPP6iDfb2LeKscwz zmMCc*{Y;S1Afid+TCplRWGO7qR~dJNTOnVQVKXx_QxnXBN*u}uU05N18^qmT_rxA; z#P1rZLo`OEpNExftGr~sY^A>E6BBI`D7-{Ahe67^K>mM!9SSAb?RY+la7?zRI*8k@TO|MUM8<^hV#S6{gA1BoJ# zx`rKLb(H74YfyoW#Q_WXNONc}Nv>pPI1RE#@3V$_4xS*Pb~QCi8YYj3pyrTz5c^~7 zBJ0X@t>RhlHn|jfM)k+eB;#fqR(99RADd-b&Wx^QIw?M6F+t;1uI$1z7-)p^Qo_$9 z-yXmjJYMyhWi{(Ml9TF@+E$iSGc%};n%HiLQs89uF1T~|ZDGi3@r+Hih|lv)a#FQC zsm-?Xd+%dICM`%XobpQZEojUM+{2o8%~xN`45ynkQa9hB`D$nH_DrOQrCd`A%|6+A zjbCic$z}4P1Fri?_+kC+9-@_z9ifeJW2!zLq}ssDfk0)9_@{ZCI1XzEH+{1fYbRv| zm8aPz-ogVZ+fPV*OBc}&vZA0vR}ZjGi%g?gEhR=tk-N>tU?YKWhY9+FGReBEx&;#Q zl0K7sc~lHcywnd4DNnb|Don{| z(Dj+=Q(a(wHbM2*;=HD^>+NzO4shKKGo+-*;WI|3W=YzC6@4VJLA=D2JFdu~gV)8k zU6?RKffvkprAupdV?+_89o-Z%gV}I9@mU=yc{L3?^9gq{SR|^u4_^OU6;t zG>oOb^_CzFcPwZwYPe@2a52}uwo@YR+NYs}JG*gA#u@9b8`-OMQaD9EQtnE&VRve$ zLgb$hNtaJqDf2H7CV46|r44_CL#8z$C1l4^R-FqeNL=BFcKuvAJ!HFo>xMNCeLVdh zt_Pir+J1IflcYmklw0bNl>xK<7k^VS+;qQqs|v!|y|z};4)uQPV(B!*$ai;4iykMA;wqVT z88zYeySR*F9dtugLX=^4r4A0F?beNyx97h>ztkWISmQ7+2pf4xx z&IkuHI6d)ZpI$^v%OyCR?Aap5-klb^wLesUf*;gQio1k7Xl>6=cHkjxiG0dQr^%L= znH*J4^SJ{$z2dYe&F*o5?q(hCavp-IU*b!X4$HrlTd zQeJ~2RVGlMNJWfKL;X%+aI4^$pT&jaeZ`A3-a*WReXbNE9Jeg~j79bjiAgWqCm^ru!+_N}&Q|srND)yPFI1X_#U z$BnLe)#?Mqm~DzxXRM-5AP7bJ98WQ3OD3P4EIc|wjDVtF!yYlD_CQnN-E8r5rMK>+ zh3=)KQtw3DTJJt|XjKKaYvjmzDs%|MHYJLPUVME`jhxXFJbS0dY2<+fm5MqrQ;5*u z8nKO64Bkm?O!tKxacq9E%BYSSM${UUE#oT8Hsu=w(5iXTAdX6t+@lHU zJ)|U%I?Q%MkTrk)C=)f!@IA;r6GRzkOWDepP|jvUQI*68)VI(_Tze`|B$UkkQ|VANASh?^x$~k*#%mv-4GwY=Z0kkeQL=9_sYy;Uj0IJvKKw(U%rZK zv^lZV6P;`sQ>2-T%rNw@pLs87EzDC(Wwa_pJ@Tt0cH1wh+*UMtsr@Rw&Cas?vs_I$ z6emPos-$gpg|2ctXG+L)C~#%AmS8<}L2}N*t*IKjhR}E)8a&LnH_raX1h6Yc24n-H z_@7;|A1}qu7nuLPiP6y4!~#3(qs-~o<=S~j zz0OJm1&}1n^O!M5j)z;62qw9a{n{ul7*@Ug(OxLEl%eE|Hyot41##amo8WtNXdx}y z;|ohmD0JMA8j2vx8ER(zCY)rHq`dAJt z`)`X{M3QS@E3HWizcplPSQo@3b4!IgN9h z)rR1)K@}9mQQQ&JbJ+&F=*=&CHibHd!-h@hE4Hk7D|}k9%S2-Zu46>eEX)Pn$k8kY z_7B;I+PW&Ymg8e1x&yAiDMgYa>2Aqarf`%hCVz69e1uc-l>h|m@Nv^_F4FtQg|hL= z#~>-(e)}9FJ?=41GW;P50@`39^MoYSrS%Es!%PDIE7-eDp=mSg5+?adMzgZ(-e)*SU?a$cgSnf@fN$ zggb~?B7dzLftE|&vUr0pO_Sz!;*7RH)I#9rl(sSa7MR6j7%rP_jV?WIl27@ujy$#d zq-V`0gp9}1Gt?9Y)%dny@7i))RF|R`=(%7Oj^6~M^Qg@GB!Ps9VTR>5;-Ck|1Tp0L zVO<2K>X=4B3lCIBt~-8i6V0DHisHl36-nm3mmXHNMnn``-9bqbJoj{WnqQ-}(dLNO z=54hGJxK3Cx*MLReGoZ;<78YUe#i^^It6z(b_W+ISV=UeBXV-oO_|f%*L(sYqWS`s zS?)eQQ-7u#+ zY^4s8MOeJn$rf(!)8(Ix6A%QiPZhI|C~b`{mYw`8P24fLLX}88=1-!>L}g!l7N2R-IUODtyNBU}_eJKx z76XGFjx+VLUc1rUJ7T%Kq^+s~1=|7Hb_|#xAkcwXQC>n#Xv)ZI;mUfM$-__f1e2Qsvduic zYRKo_l-Zc7T;5IJO6$6|Q{O7V@-iKB%PpVpxq-l^_reKoZ(Tv_hwGxp^6ptx@H>0! z6Y~P~R@}%Zk2Op8k52T4xm-+ZO9|)to9_l(+bZ4i)rsg@yWP~Rt$$-HnY*ys)5C>U zsHpUslgB-850|}#8@~F3s+uqNPG)yQ&<;=#4{VrA)Qb59{hjSkJMM6NqJ4x|8!u0# zL&MM3CIfG-OKYYXHtdR1idkK5;#z>Nu{W+}8fJ)RfGwnJ&8^i;u;WdUp64j59`;(K zNWD+A1?q78;dJ_eLJFafmFGZ$X<@^H7K^DOHlw^>+1*B>pec`jBqc=LwFUC`JR1+k z&T>zh(p(sW(}`hh8>%sJ-F5HwPE)AfvNNYDk@*~kX&M4gy_pz8BZH{pPw-BgrMnH< zK%|)10R@hv$Qp^F7>SHfrJ-%)U9G8Rd&O{7@oE$G+0)5&;~rsbv3%`Cb%NXb-}v_ERDpb2j|*x%b?vF3;V zVEh7JWbqwb8Q)ik8MDM|m?G~b-Hd`%?laO3a|p)2^y6BT(`(Z?PEObVU=VUPcpa^Q zP&o<5%f}OP4Wnud6$i3ecas=apo@SOvVMtrbi7O#kse`nj8sa;LA|)>!P4hD^0;R~ zx>dQuj+`>uIK)Mb6$E|QF+rIe_pMwDojkU)IQGhVwwXxKnKCaE*Er4zQfqjOL`(}!AxiU_4V#OtFH?4RjCcvg<9 zQsyPC$0qnR*~wK-`muqjD1piVnaj0U2uuG`TKIvXYYJc6RyLJTm+cD~Zge@Wd@}Xp z+#f-t+gOktPH{w_x{>4mv4hP7s%-VRTt^!+MnHPDR~~Cu_(cxX5H@sKf>454=L3Ix zBREf<4kBG7(s45lUSuuZUQrQU77!HbQ&RKk7XxMJPf0q`@IdhqEt+MYsHjy<_mlgO zH2c@!%Ru)rtbz&#_u_6*j#U9-m}kkqv4L{46c|3|uDc zVs?CS1G2&dgm_I74Ne$kVeC*I?d@l73Hk98^OOlkgnr|TJ-q0uT+=LsgS2{iIm&3* zTsw$ej!UW1F=mroRY<;mw+|_0!y%RD+s5Vn?YQkB_ys&+=0t`h9>w1k!m*<2*um1l zXp&p{IAs%yg(GhMmUQu6R$I!=6p;1quKAe3D^RM10q(>R!pk!0n=$_55cqg24p zqV{no+{A^t2XqaMaNkR6_97k}2db=R@6wzH+L&$h0yDY--oFS`5(hb~{<< z{SVHOLEN&!aG9mcpi=2V$LZRgg8=QYz22^|p0z29>#~)^i8yL9u>{iOLH+}spin#r z-XK+|7wcmXNr(&ZgA;1rk$PDiv$DHQ_pugxlH2ZX;1bcg#JqO&)YgT~;6!hPSEY=} zP;;3-TL^wO9f%WSD%ib)I84K{)q_$5%P9JEKQic6^t}Ioo(;*p#W0Dv+9gh56Sml; zc#<~>z}Xe|K{5{b+1oI)XV6=EZR}%cDMo|N$N`iAfl)-6vO}M=Ikq76;f?tZpN1~M zKFEvaa*Gr|3-`By@ICZ{RDMV@$%X+hpuArcV{|oP+bl|S_X!ARvD5VtAI8+D~SRL7^W z^Dd)D;T#WPs=~6#b>+t5)2UiX-pdV=q*_X0@d{9Pa%;nu*m|H9%Zy%w)PmfOSA1=_ zOtANLygf&ImZcVHJ&ZM#Ef-X;GBHI~z!`TrrQ);& z^MWF|cB~EsyEIa<2K~OX9pOq?T?_oiU97c@2TkweqtLB&NAboMeW7Ox7D5qpc=sY_ zDNfUg)l}~Be57u9&Q7>LW9Gg4?z*z|Mpl{M^0TNe^uT=)4}97g!3JCJpgR0vIxO8U zHweVa(^dz}Ybw>DskJaXUB)|9Js=24$e5>j>{FmJ+mL0)%D0E~$(b~eyi{Xj5s`){ zavlp4MUxM#xFF{rB&QH%S;mO;s|O?8P$Lky{wSVf05#unM@B(*Z`5jxCQ##ZtHbf& zSmoI3likfdvJ(@s@)&j5WssGsTnY2h;1P+3aj4;Qi-BYL_W`=AJn!$5Qr;}>RmxpEn4#?C zle73#ZrfYX;itRdu^aj-8)mHeK?^k&QcVlA)O*WJU!)!)^_&J9TWGsENMcP^JRqu{X zlN{$WuD8VZA>2%_XE$M+(vQu5W2Ks1m7lLIATSjEexyF-HZ@x9K(3ceK>T!p3{F%L zk!7EF4qMc9)6~g)VmBzP5FgpsQLTvY3~rX+;>IK6%gc;P%Oy3=QZYS}#jLy*$1~4E zT-j@zk{DV3gjk;@H=3Um%{gVwZg=&Q-^e4cM-ny`kS{1x8Z;L6V<$>q`A2{@QO1%Z z7jltD++{aOk}yk`duAgB^iT_8d7D(UD)jV0+p&&+euIusy;w~x# zj%yI|%&Fmol-@|?Mz4;RPL9^0idyd0>oqs(mYm)_8QEKFK^NAaZ$81O(mO8mX>B@7 z6u6hFaeKi(7g#lCEi~+0V&M*)-^V38@g04O?SXK;NChTw|i|OJb{fW+j;UO|q63>|lmHxu6!D&)8rYmTQm#KT&niVB6l4UhHq%x{ zhB*yPAUh8>f~D@hHxeb=qL=LUZcjDKYd|wZTt4EyS#0CNL%BT)0Wb7? zX4-x=041RFwugpKsBmX3*-$^eyMbB%jMDRiJbDvs+q>7B?L>_50r#CkVNN{Jm(4qk z8;VFd_2b4*_fUEv9D=r;@8i88*q+s6x?O~5^}xTW?h_@>8WX+H$Cw7ik-dY8?Wy&e zHqn>qYyz-3GRyBP(k)8brfnoVp_HTu`%Bb(LZ9?JB|SmK_9)og9*g5dH?8Cn@i69! z%n-$J0B+{pf0bOS^G+azrKNQkQpEKBPS%tuZD+9=C;k)%R@#7+LzSz%I}s*tZ7c3G zijp(J0M2&0RarUO*-UD2#rRAnNNwJa>Pje&WCq>l6-@ZH)3oF`;LVox*u{$>ht)Q zYHDg}zG;S&YGtu^ScqK`o_~7HS_dNZ?sh55`_hjK4%z)eb2RPqCwRJ;WWLm|OX^WQ&(bD+l&|FDs4Xo+!P#lBEDO96xRtYGVFg~DBC z<`TItAqOqDlCne&wwPhv)<<*sp5mb+-rC6`ZQ<|jcX#KGs0X3?FGufCCOo>U0pSRR z%Z194cVI0{i$bUH#(Cye0)^>PO@x&NS-4Z3&TQW2ex%tLIC)~`v;b$$I!WXw#>FXf zK3|g!mE;iwNVXQ6mpYp75WmT$2&q~^btvM+A2tWEz#kl`AB*0-|3s>`sC9TzNV=fN z@=>s2Y%4kg^LD_&z|zteI?B&f2rzmr#|Hv~p0kHs2~XK1)v|dg-A*jTM%Z}?rXJi% z5<~d%rrG%`Y2A^{y%S8eTpGiU!3+@TX*vgXeB`LYykm##{o{b=_y=dwtF6O$hHWY^(kj% z@-yvRI!C^Vqu01M&|p~D;-WAKQAy&+_h4u;w4jnuvLys*)`t%J81}IfD!i6Nl`VUj z`;m!rDH)qoMHw-cr_-V6*B_oP)EuJPoB2q6{0gI+R5+6~4k8aKB)U%iB1+V3G?uis zy_rLey1h%%k@{W>53lK~pW=a3Ktrm3&i9TD1S~NEEW-NPA{hm72`y$h8CA7=QEW(1 zBFGX)ybthF2+aBUuRXx2!aUkgz-O11jAL5a9FrWRln8(0osmJ++Y3v!6P`Kh)%Z5s z4dI?mZ(g>Ow3rR~LRISq$WthYdC%pr@Hkhl2+kH}yi0_jPWm~BaRz1MB#AqYR_T%8 zvw_zyJg{p^u6cX1HJmuzgnaQ8c>zdF4he+~4cs3EPN$z&8mQ-w2YC1Y?}HApDRTbn zkNuKw#jt^52>%qbG{yCP0^Gj<0jF_*|NeNg1I}+`{3s?bq97wFp{m9#FZnaL3=9nH zTmSoE&7=Yq~lIDEhRab;PeOJybgr>r%QAJN#} z)!G=yka(pK*(D+0tA$+L?5`9fza-XpwV0c$we5dUJG@%W(cIbeO11MB3g4dd*5(Gf z>vC&fYB3XI7wfC#F1MTe)pF+{qObCVbAP+2TjkYaKS!3kN|frm=0EOr@F&r45pJ#$ z#JeQO3nT%*+=3UUYyNTiZv*Yz>0u~_mc4-i;Rgiry{HugM0SAv|A_o}%ky*4t8cZs z5bV;SQxpYeC`CY&{70?M1sQ-T;c~5h2m+T?zP&X9S99Vp7YzZ_CIPkUm(&V?+2l8B z5}u~!Kb;!_*USkP*en7(mH|+ZxTNU@yxh91dCBw6hnT9Hy^6Vot-0y>xg<&B^DL)c zGCvLIUz_2}2a@y#dYJ?O2wy@50iR9(59C!n(1EYTcAl_p6R?r%5=;;1ra!>sjV*tb z1s=Q&Lk@f4?gIu<0tTsEVz}V`k@2fG{C=Ds$VTsA|K|o}KFbrF27Ds;->kIXtB@UF z0ZhMtuu6*DkWP9f>z`Rv%+}b&MID$=U4HEv z?cBYi=L-}Ckn!=4s4Fu*gR{VM-(IlXfUEX@WPR(q-{epF^#}t` zV0l5L1ibZ+#NVg01UC&l8{!2>2=JLdf_|GD5u5{_5ATALE%g_iE3@N)v%s^VU9d23 z{|)PxxzWHO;90aTAi{Eg0lCsA{wJpvI2=5k$OXJo^-B2PB^Lq5foD#*z;SE-4erl# z6?jbf3xc1{e81-K}9#D)veOz+={{<O|TtN<<#ew+A09y9Q_^4}fi%DctjB=9SM7o?ux-;&Pf_rEs= z{EplO0x|Trh(Fz!1GfYGn$QL0PQ-5^zr8dBt`2^V^+KI45nTO;!=Ja(ul*DJ0N90` z(4(LBDgQkV23{HPJ?e|nQ~5uY{zE literal 0 HcmV?d00001 diff --git a/org.yakindu.sct.examples.sctunit.java/metadata.json b/itemis.create.examples.sctunit.java/metadata.json similarity index 85% rename from org.yakindu.sct.examples.sctunit.java/metadata.json rename to itemis.create.examples.sctunit.java/metadata.json index 22d478b4..01e0f15c 100644 --- a/org.yakindu.sct.examples.sctunit.java/metadata.json +++ b/itemis.create.examples.sctunit.java/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.sctunit.java", + "id": "itemis.create.examples.sctunit.java", "title": "Java Code Generation for SCTUnit with Mockito", "author": "itemis AG", "description": "This example demonstrates how to generate JUnit tests for SCTUnit tests.", diff --git a/org.yakindu.sct.examples.sctunit.java/models/java.sgen b/itemis.create.examples.sctunit.java/models/java.sgen similarity index 81% rename from org.yakindu.sct.examples.sctunit.java/models/java.sgen rename to itemis.create.examples.sctunit.java/models/java.sgen index 3819829f..49a5d480 100644 --- a/org.yakindu.sct.examples.sctunit.java/models/java.sgen +++ b/itemis.create.examples.sctunit.java/models/java.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::java { +GeneratorModel for create::java { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.java" + targetProject = "itemis.create.examples.sctunit.java" targetFolder = "src-gen" } /* TODO: Should be possible using observables only. */ diff --git a/org.yakindu.sct.examples.sctunit.java/models/light_switch.ysc b/itemis.create.examples.sctunit.java/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.sctunit.java/models/light_switch.ysc rename to itemis.create.examples.sctunit.java/models/light_switch.ysc index 5647ea8b..3b1b3813 100644 --- a/org.yakindu.sct.examples.sctunit.java/models/light_switch.ysc +++ b/itemis.create.examples.sctunit.java/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.sctunit.java/tests/java_test.sgen b/itemis.create.examples.sctunit.java/tests/java_test.sgen similarity index 79% rename from org.yakindu.sct.examples.sctunit.java/tests/java_test.sgen rename to itemis.create.examples.sctunit.java/tests/java_test.sgen index fd123bca..99475fe8 100644 --- a/org.yakindu.sct.examples.sctunit.java/tests/java_test.sgen +++ b/itemis.create.examples.sctunit.java/tests/java_test.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for sctunit::java { +GeneratorModel for create::sctunit::java { /* Refers to the sctunit test 'LightSwitchTest' */ test LightSwitchTest { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.java" + targetProject = "itemis.create.examples.sctunit.java" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.sctunit.java/tests/light_switch_test.sctunit b/itemis.create.examples.sctunit.java/tests/light_switch_test.sctunit similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/tests/light_switch_test.sctunit rename to itemis.create.examples.sctunit.java/tests/light_switch_test.sctunit diff --git a/org.yakindu.sct.examples.sctunit.python/.gitignore b/itemis.create.examples.sctunit.python/.gitignore similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/.gitignore rename to itemis.create.examples.sctunit.python/.gitignore diff --git a/org.yakindu.sct.examples.sctunit.python/.project b/itemis.create.examples.sctunit.python/.project similarity index 90% rename from org.yakindu.sct.examples.sctunit.python/.project rename to itemis.create.examples.sctunit.python/.project index cfc600a8..1af38f5c 100644 --- a/org.yakindu.sct.examples.sctunit.python/.project +++ b/itemis.create.examples.sctunit.python/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.sctunit.python + itemis.create.examples.sctunit.python diff --git a/org.yakindu.sct.examples.sctunit.python/.pydevproject b/itemis.create.examples.sctunit.python/.pydevproject similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/.pydevproject rename to itemis.create.examples.sctunit.python/.pydevproject diff --git a/org.yakindu.sct.examples.msp430.blinky/css/style.css b/itemis.create.examples.sctunit.python/css/style.css similarity index 100% rename from org.yakindu.sct.examples.msp430.blinky/css/style.css rename to itemis.create.examples.sctunit.python/css/style.css diff --git a/org.yakindu.sct.examples.sctunit.python/images/model.png b/itemis.create.examples.sctunit.python/images/model.png similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/images/model.png rename to itemis.create.examples.sctunit.python/images/model.png diff --git a/org.yakindu.sct.examples.sctunit.python/images/testoutput.png b/itemis.create.examples.sctunit.python/images/testoutput.png similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/images/testoutput.png rename to itemis.create.examples.sctunit.python/images/testoutput.png diff --git a/org.yakindu.sct.examples.sctunit.python/images/watch_gears_thumb.jpg b/itemis.create.examples.sctunit.python/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/images/watch_gears_thumb.jpg rename to itemis.create.examples.sctunit.python/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.sctunit.python/index.html b/itemis.create.examples.sctunit.python/index.html similarity index 63% rename from org.yakindu.sct.examples.sctunit.python/index.html rename to itemis.create.examples.sctunit.python/index.html index ad5081c3..d10641f3 100644 --- a/org.yakindu.sct.examples.sctunit.python/index.html +++ b/itemis.create.examples.sctunit.python/index.html @@ -15,7 +15,7 @@

    Python Code Generation for SCTUnit with unittest

    Example application

    Example application

    - The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit. + The example application and SCTUnit test is based on the previous example Testing State Machines with SCTUnit.

    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ஃ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

    Test Code Generation

    - Code generation for Python code has already shown step by step in the previous example Python Code Generation. This example contains a code generator python.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: python_test.sgen. The generator ID for this example is sctunit::python. You can right click the generator file and generate the code artifacts. This will generate the unittest, which can be executed as unittest test. If you don't use pydev, you can run the test via console: + Code generation for Python code has already shown step by step in the previous example Python Code Generation. This example contains a code generator python.sgen file for generating the state machine code, which is required. Additionally to that, the tests folder contains a code generator file for the SCTUnit file: python_test.sgen. The generator ID for this example is sctunit::python. You can right click the generator file and generate the code artifacts. This will generate the unittest, which can be executed as unittest test. If you don't use pydev, you can run the test via console:

    python3 -m unittest test_lightswitchtest.py

    - +

    Test execution

    diff --git a/org.yakindu.sct.examples.sctunit.python/metadata.json b/itemis.create.examples.sctunit.python/metadata.json similarity index 84% rename from org.yakindu.sct.examples.sctunit.python/metadata.json rename to itemis.create.examples.sctunit.python/metadata.json index c51f5cab..eb42b6e8 100644 --- a/org.yakindu.sct.examples.sctunit.python/metadata.json +++ b/itemis.create.examples.sctunit.python/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.sctunit.python", + "id": "itemis.create.examples.sctunit.python", "title": "Python Code Generation for SCTUnit with unittest", "author": "itemis AG", "description": "This example demonstrates how to generate unittests for SCTUnit tests.", diff --git a/org.yakindu.sct.examples.sctunit.python/models/light_switch.ysc b/itemis.create.examples.sctunit.python/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.sctunit.python/models/light_switch.ysc rename to itemis.create.examples.sctunit.python/models/light_switch.ysc index 5647ea8b..3b1b3813 100644 --- a/org.yakindu.sct.examples.sctunit.python/models/light_switch.ysc +++ b/itemis.create.examples.sctunit.python/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.sctunit.python/models/python.sgen b/itemis.create.examples.sctunit.python/models/python.sgen similarity index 78% rename from org.yakindu.sct.examples.sctunit.python/models/python.sgen rename to itemis.create.examples.sctunit.python/models/python.sgen index b05b06ee..e674ebba 100644 --- a/org.yakindu.sct.examples.sctunit.python/models/python.sgen +++ b/itemis.create.examples.sctunit.python/models/python.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for yakindu::python { +GeneratorModel for create::python { /* Refers to the statechart model 'LightSwitch' */ statechart LightSwitch { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.python" + targetProject = "itemis.create.examples.sctunit.python" targetFolder = "srcgen" } /* TODO: Should be possible using observables only. */ diff --git a/org.yakindu.sct.examples.sctunit.python/tests/light_switch_test.sctunit b/itemis.create.examples.sctunit.python/tests/light_switch_test.sctunit similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/tests/light_switch_test.sctunit rename to itemis.create.examples.sctunit.python/tests/light_switch_test.sctunit diff --git a/org.yakindu.sct.examples.sctunit.python/tests/python_test.sgen b/itemis.create.examples.sctunit.python/tests/python_test.sgen similarity index 69% rename from org.yakindu.sct.examples.sctunit.python/tests/python_test.sgen rename to itemis.create.examples.sctunit.python/tests/python_test.sgen index 06f51095..97749cc5 100644 --- a/org.yakindu.sct.examples.sctunit.python/tests/python_test.sgen +++ b/itemis.create.examples.sctunit.python/tests/python_test.sgen @@ -1,10 +1,10 @@ /* Defines which code generator to use */ -GeneratorModel for sctunit::python { +GeneratorModel for create::sctunit::python { /* Refers to the sctunit test 'LightSwitchTest' */ test LightSwitchTest { /* Specify the target location for the generated artifacts. */ feature Outlet { - targetProject = "org.yakindu.sct.examples.sctunit.python" + targetProject = "itemis.create.examples.sctunit.python" targetFolder = "srcgen" } } diff --git a/org.yakindu.sct.examples.sctunit/.gitignore b/itemis.create.examples.sctunit/.gitignore similarity index 100% rename from org.yakindu.sct.examples.sctunit/.gitignore rename to itemis.create.examples.sctunit/.gitignore diff --git a/org.yakindu.sct.examples.elevator/.project b/itemis.create.examples.sctunit/.project similarity index 88% rename from org.yakindu.sct.examples.elevator/.project rename to itemis.create.examples.sctunit/.project index 4d8b6cdb..15ea15a4 100644 --- a/org.yakindu.sct.examples.elevator/.project +++ b/itemis.create.examples.sctunit/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.elevator + itemis.create.examples.sctunit diff --git a/org.yakindu.sct.examples.raspberry.helloworld/css/style.css b/itemis.create.examples.sctunit/css/style.css similarity index 100% rename from org.yakindu.sct.examples.raspberry.helloworld/css/style.css rename to itemis.create.examples.sctunit/css/style.css diff --git a/org.yakindu.sct.examples.sctunit/images/coverage_model_1.png b/itemis.create.examples.sctunit/images/coverage_model_1.png similarity index 100% rename from org.yakindu.sct.examples.sctunit/images/coverage_model_1.png rename to itemis.create.examples.sctunit/images/coverage_model_1.png diff --git a/org.yakindu.sct.examples.sctunit/images/coverage_report_1.png b/itemis.create.examples.sctunit/images/coverage_report_1.png similarity index 100% rename from org.yakindu.sct.examples.sctunit/images/coverage_report_1.png rename to itemis.create.examples.sctunit/images/coverage_report_1.png diff --git a/org.yakindu.sct.examples.sctunit/images/model.png b/itemis.create.examples.sctunit/images/model.png similarity index 100% rename from org.yakindu.sct.examples.sctunit/images/model.png rename to itemis.create.examples.sctunit/images/model.png diff --git a/org.yakindu.sct.examples.sctunit/images/watch_gears_thumb.jpg b/itemis.create.examples.sctunit/images/watch_gears_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.sctunit/images/watch_gears_thumb.jpg rename to itemis.create.examples.sctunit/images/watch_gears_thumb.jpg diff --git a/org.yakindu.sct.examples.sctunit/index.html b/itemis.create.examples.sctunit/index.html similarity index 91% rename from org.yakindu.sct.examples.sctunit/index.html rename to itemis.create.examples.sctunit/index.html index 846cd30a..06cdb036 100644 --- a/org.yakindu.sct.examples.sctunit/index.html +++ b/itemis.create.examples.sctunit/index.html @@ -17,7 +17,7 @@

    Testing State Machines with SCTUnit

    Example Application

    - As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial. + As an example application we will use the light switch example with brightness adjustment from the Basic Tutorial.

    Light switch model @@ -61,11 +61,11 @@

    SCTUnit Test

    The test can be executed with Right click -> Run As -> SCT Unit. Further informations on how to use the SCTUnit language can be found in our documentation.

    Test implementation

    This is the complete test implementation: - +

    Coverage

    - YAKINDU Statechart Tools supports another feature to improve the testing quality: Coverage. Each time a test is executed, a coverage analysis is started. The coverage score indicates how many of the state machine paths have been tested. + Itemis CREATE supports another feature to improve the testing quality: Coverage. Each time a test is executed, a coverage analysis is started. The coverage score indicates how many of the state machine paths have been tested.

    Let's take the LightSwitchTest and remove every test except for the very first one - testInitiallyTurnedOff. Executing the test will also run a coverage analysis, as mentioned before. The result of the coverage analysis is displayed in the coverage view: diff --git a/org.yakindu.sct.examples.sctunit/metadata.json b/itemis.create.examples.sctunit/metadata.json similarity index 86% rename from org.yakindu.sct.examples.sctunit/metadata.json rename to itemis.create.examples.sctunit/metadata.json index 0609892a..642d9863 100644 --- a/org.yakindu.sct.examples.sctunit/metadata.json +++ b/itemis.create.examples.sctunit/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.sctunit", + "id": "itemis.create.examples.sctunit", "title": "Testing State Machines with SCTUnit", "author": "itemis AG", "description": "This example demonstrates how to write tests for statecharts using SCTUnit.", diff --git a/org.yakindu.sct.examples.sctunit/models/light_switch.ysc b/itemis.create.examples.sctunit/models/light_switch.ysc similarity index 98% rename from org.yakindu.sct.examples.sctunit/models/light_switch.ysc rename to itemis.create.examples.sctunit/models/light_switch.ysc index 1be42f49..0962b2ea 100644 --- a/org.yakindu.sct.examples.sctunit/models/light_switch.ysc +++ b/itemis.create.examples.sctunit/models/light_switch.ysc @@ -13,7 +13,7 @@ - + diff --git a/org.yakindu.sct.examples.sctunit/tests/light_switch_test.sctunit b/itemis.create.examples.sctunit/tests/light_switch_test.sctunit similarity index 100% rename from org.yakindu.sct.examples.sctunit/tests/light_switch_test.sctunit rename to itemis.create.examples.sctunit/tests/light_switch_test.sctunit diff --git a/itemis.create.examples.stm32f407vg.blinky/.cproject b/itemis.create.examples.stm32f407vg.blinky/.cproject new file mode 100644 index 00000000..3b89f80f --- /dev/null +++ b/itemis.create.examples.stm32f407vg.blinky/.cproject @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/.gitignore b/itemis.create.examples.stm32f407vg.blinky/.gitignore similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/.gitignore rename to itemis.create.examples.stm32f407vg.blinky/.gitignore diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/.project b/itemis.create.examples.stm32f407vg.blinky/.project similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/.project rename to itemis.create.examples.stm32f407vg.blinky/.project index e98a4b85..c0eb8644 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/.project +++ b/itemis.create.examples.stm32f407vg.blinky/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.stm32f407vg.blinky + itemis.create.examples.stm32f407vg.blinky diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/main.h b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/main.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/main.h rename to itemis.create.examples.stm32f407vg.blinky/Core/Inc/main.h index 82c92a30..fe94005c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/main.h +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/main.h @@ -1,71 +1,71 @@ -/* 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) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ -#define SCT_MAIN 1 -/* 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 -----------------------------------------------------------*/ -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* 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) 2020 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ +#define SCT_MAIN 1 +/* 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 -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h rename to itemis.create.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h index b883deea..45789ebc 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/sc_timer_service.h @@ -14,7 +14,7 @@ extern "C" { #endif -/*! file/ Interface definition of a POSIX thread based timer service for YAKINDU SCT state machines. */ +/*! file/ Interface definition of a POSIX thread based timer service for CREATE SCT state machines. */ struct sc_timer_service; diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h rename to itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h index 92eb28d2..6b705a32 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_hal_conf.h @@ -1,443 +1,443 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - - /* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -/* #define HAL_I2C_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)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 ((uint32_t)0x000000FFU) -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) - -#define PHY_READ_TO ((uint32_t)0x0000FFFFU) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)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 "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPI_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)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 ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)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 "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h rename to itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h index bb403d38..af3abce1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h @@ -1,70 +1,70 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void TIM5_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void TIM5_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/main.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/main.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/main.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/main.c index 07d5cfde..936ada1d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/main.c +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Src/main.c @@ -1,276 +1,276 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "Blinky_required.h" -#include "sc_timer_service.h" - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ -#define MAX_TIMERS 20 -#define TICK_MS 1 -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim5; - -/* USER CODE BEGIN PV */ -Blinky sm; -static sc_timer_t timers[MAX_TIMERS]; -static sc_timer_service_t timer_service; - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_TIM5_Init(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_TIM5_Init(); - /* USER CODE BEGIN 2 */ - HAL_TIM_Base_Start_IT(&htim5); - sc_timer_service_init(&timer_service, timers, MAX_TIMERS, (sc_raise_time_event_fp) &blinky_raise_time_event); - blinky_init(&sm); - blinky_enter(&sm); - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - /** Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 168; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - /** Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) - { - Error_Handler(); - } -} - -/** - * @brief TIM5 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM5_Init(void) -{ - - /* USER CODE BEGIN TIM5_Init 0 */ - - /* USER CODE END TIM5_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM5_Init 1 */ - - /* USER CODE END TIM5_Init 1 */ - htim5.Instance = TIM5; - htim5.Init.Prescaler = 1; - htim5.Init.CounterMode = TIM_COUNTERMODE_UP; - htim5.Init.Period = 41999; - htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim5) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM5_Init 2 */ - - /* USER CODE END TIM5_Init 2 */ - -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); - - /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ - GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - -} - -/* USER CODE BEGIN 4 */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { - if(htim->Instance == htim5.Instance) { - sc_timer_service_proceed(&timer_service, TICK_MS); - } -} - -void blinky_set_timer(Blinky* handle, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic){ - sc_timer_start(&timer_service, (void*) handle, evid, time_ms, periodic); -} - -void blinky_unset_timer(Blinky* handle, const sc_eventid evid){ - sc_timer_cancel(&timer_service, evid); - (void) handle; -} - -/* 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 */ - - /* 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, - tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "Blinky_required.h" +#include "sc_timer_service.h" + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ +#define MAX_TIMERS 20 +#define TICK_MS 1 +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim5; + +/* USER CODE BEGIN PV */ +Blinky sm; +static sc_timer_t timers[MAX_TIMERS]; +static sc_timer_service_t timer_service; + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_TIM5_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_TIM5_Init(); + /* USER CODE BEGIN 2 */ + HAL_TIM_Base_Start_IT(&htim5); + sc_timer_service_init(&timer_service, timers, MAX_TIMERS, (sc_raise_time_event_fp) &blinky_raise_time_event); + blinky_init(&sm); + blinky_enter(&sm); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief TIM5 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM5_Init(void) +{ + + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 1; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 41999; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); + + /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { + if(htim->Instance == htim5.Instance) { + sc_timer_service_proceed(&timer_service, TICK_MS); + } +} + +void blinky_set_timer(Blinky* handle, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic){ + sc_timer_start(&timer_service, (void*) handle, evid, time_ms, periodic); +} + +void blinky_unset_timer(Blinky* handle, const sc_eventid evid){ + sc_timer_cancel(&timer_service, evid); + (void) handle; +} + +/* 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 */ + + /* 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, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/sc_timer_service.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/sc_timer_service.c similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/sc_timer_service.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/sc_timer_service.c diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c index 85a0961d..af7dd713 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c @@ -1,134 +1,134 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : stm32f4xx_hal_msp.c - * Description : This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** -* @brief TIM_Base MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - /* TIM5 interrupt Init */ - HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM5_IRQn); - /* USER CODE BEGIN TIM5_MspInit 1 */ - - /* USER CODE END TIM5_MspInit 1 */ - } - -} - -/** -* @brief TIM_Base MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspDeInit 0 */ - - /* USER CODE END TIM5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM5_CLK_DISABLE(); - - /* TIM5 interrupt DeInit */ - HAL_NVIC_DisableIRQ(TIM5_IRQn); - /* USER CODE BEGIN TIM5_MspDeInit 1 */ - - /* USER CODE END TIM5_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* TIM5 interrupt Init */ + HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM5_IRQn); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + + /* TIM5 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM5_IRQn); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c index f91f1a64..6860c149 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_it.c @@ -1,217 +1,217 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern TIM_HandleTypeDef htim5; -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Pre-fetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles TIM5 global interrupt. - */ -void TIM5_IRQHandler(void) -{ - /* USER CODE BEGIN TIM5_IRQn 0 */ - - /* USER CODE END TIM5_IRQn 0 */ - HAL_TIM_IRQHandler(&htim5); - /* USER CODE BEGIN TIM5_IRQn 1 */ - - /* USER CODE END TIM5_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim5; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles TIM5 global interrupt. + */ +void TIM5_IRQHandler(void) +{ + /* USER CODE BEGIN TIM5_IRQn 0 */ + + /* USER CODE END TIM5_IRQn 0 */ + HAL_TIM_IRQHandler(&htim5); + /* USER CODE BEGIN TIM5_IRQn 1 */ + + /* USER CODE END TIM5_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/syscalls.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/syscalls.c similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/syscalls.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/syscalls.c diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/sysmem.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/sysmem.c similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/sysmem.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/sysmem.c diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c b/itemis.create.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c rename to itemis.create.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c index a9cfc960..bcb2b9f4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c @@ -1,727 +1,727 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ - STM32F412Zx || STM32F412Vx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 16000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ - RCC->AHB1ENR |= 0x000001F8; - - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ - FMC_Bank5_6->SDCMR = 0x00000073; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ - FMC_Bank5_6->SDCMR = 0x00046014; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ - - (void)(tmp); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s b/itemis.create.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s rename to itemis.create.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s index e26b978b..c851be96 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s +++ b/itemis.create.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s @@ -1,505 +1,505 @@ -/** - ****************************************************************************** - * @file startup_stm32f407xx.s - * @author MCD Application Team - * @brief STM32F407xx Devices vector table for GCC based toolchains. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m4 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr sp, =_estack /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* 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 - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word 0 /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author MCD Application Team + * @brief STM32F407xx Devices vector table for GCC based toolchains. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* 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 + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h index 08e4f53d..7a2e5bb9 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h @@ -1,15594 +1,15594 @@ -/** - ****************************************************************************** - * @file stm32f407xx.h - * @author MCD Application Team - * @brief CMSIS STM32F407xx Device Peripheral Access Layer Header File. - * - * This file contains: - * - Data structures and the address mapping for all peripherals - * - peripherals registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup stm32f407xx - * @{ - */ - -#ifndef __STM32F407xx_H -#define __STM32F407xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1U /*!< FPU present */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - RNG_IRQn = 80, /*!< RNG global Interrupt */ - FPU_IRQn = 81 /*!< FPU global interrupt */ -} IRQn_Type; -/* Legacy define */ -#define HASH_RNG_IRQn RNG_IRQn - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1; - __IO uint32_t MACDBGR; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ - __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ -} FLASH_TypeDef; - - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @brief USB_OTG_Core_Registers - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ - __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ - __IO uint32_t CID; /*!< User ID Register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ - __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ - __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ -} USB_OTG_GlobalTypeDef; - -/** - * @brief USB_OTG_device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ - __IO uint32_t DCTL; /*!< dev Control Register 804h */ - __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ - __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ - __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ - __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved9; /*!< Reserved 824h */ - __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ - __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ - __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ - __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ - __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ - __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ - uint32_t Reserved40; /*!< dedicated EP mask 840h */ - __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ - uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ - __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ -} USB_OTG_DeviceTypeDef; - -/** - * @brief USB_OTG_IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ - __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ - __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ - __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ - uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ -} USB_OTG_INEndpointTypeDef; - -/** - * @brief USB_OTG_OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ - __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ - __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ - uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ -} USB_OTG_OUTEndpointTypeDef; - -/** - * @brief USB_OTG_Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ - __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ - __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ - __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ - __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ -} USB_OTG_HostTypeDef; - -/** - * @brief USB_OTG_Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ - __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ - __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ - __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ - __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ - __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ - uint32_t Reserved[2]; /*!< Reserved */ -} USB_OTG_HostChannelTypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ -#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ -#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ -#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ -#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) -#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) -/* Legacy define */ -#define ADC_BASE ADC123_COMMON_BASE -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) -#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) -#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) - - -/*!< Debug MCU registers base address */ -#define DBGMCU_BASE 0xE0042000UL -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE 0x40040000UL -#define USB_OTG_FS_PERIPH_BASE 0x50000000UL - -#define USB_OTG_GLOBAL_BASE 0x000UL -#define USB_OTG_DEVICE_BASE 0x800UL -#define USB_OTG_IN_ENDPOINT_BASE 0x900UL -#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL -#define USB_OTG_EP_REG_SIZE 0x20UL -#define USB_OTG_HOST_BASE 0x400UL -#define USB_OTG_HOST_PORT_BASE 0x440UL -#define USB_OTG_HOST_CHANNEL_BASE 0x500UL -#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL -#define USB_OTG_PCGCCTL_BASE 0xE00UL -#define USB_OTG_FIFO_BASE 0x1000UL -#define USB_OTG_FIFO_SIZE 0x1000UL - -#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ -#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ -#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC1 ((DAC_TypeDef *) DAC_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) -/* Legacy define */ -#define ADC ADC123_COMMON -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) - */ -#define ADC_MULTIMODE_SUPPORT /*!
    © Copyright (c) 2017 STMicroelectronics. + * All rights reserved.
    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f407xx + * @{ + */ + +#ifndef __STM32F407xx_H +#define __STM32F407xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M4 Processor and Core Peripherals + */ +#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1U /*!< FPU present */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F4XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + DCMI_IRQn = 78, /*!< DCMI global interrupt */ + RNG_IRQn = 80, /*!< RNG global Interrupt */ + FPU_IRQn = 81 /*!< FPU global interrupt */ +} IRQn_Type; +/* Legacy define */ +#define HASH_RNG_IRQn RNG_IRQn + +/** + * @} + */ + +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "system_stm32f4xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + +/** + * @brief DCMI + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ + __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ + __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ + __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ + __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ + __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ + __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ + __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ + __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ + __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ +} DCMI_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1; + __IO uint32_t MACDBGR; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RESERVED8; + __IO uint32_t PTPTSSR; + uint32_t RESERVED9[565]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARSWTR; + uint32_t RESERVED10[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ + __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ +} FLASH_TypeDef; + + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + +/** + * @brief USB_OTG_Core_Registers + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ + __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ + __IO uint32_t CID; /*!< User ID Register 03Ch */ + uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} USB_OTG_GlobalTypeDef; + +/** + * @brief USB_OTG_device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ + __IO uint32_t DCTL; /*!< dev Control Register 804h */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved9; /*!< Reserved 824h */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ + uint32_t Reserved40; /*!< dedicated EP mask 840h */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ + uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ +} USB_OTG_DeviceTypeDef; + +/** + * @brief USB_OTG_IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} USB_OTG_INEndpointTypeDef; + +/** + * @brief USB_OTG_OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ + __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ + __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ + uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ +} USB_OTG_OUTEndpointTypeDef; + +/** + * @brief USB_OTG_Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ + __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ + __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ + __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ + __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ +} USB_OTG_HostTypeDef; + +/** + * @brief USB_OTG_Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ + __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ + __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ + __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ + __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ + __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ + uint32_t Reserved[2]; /*!< Reserved */ +} USB_OTG_HostChannelTypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) +#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) +#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) +#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + + +/*!< Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ +#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.
    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx - * @{ - */ - -#ifndef __STM32F4xx_H -#define __STM32F4xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/** - * @brief STM32 Family - */ -#if !defined (STM32F4) -#define STM32F4 -#endif /* STM32F4 */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ -#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \ - !defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \ - !defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \ - !defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \ - !defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \ - !defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) - /* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ - /* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ - /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ - /* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ - /* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ - /* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ - /* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, - STM32F439NI, STM32F429IG and STM32F429II Devices */ - /* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, - STM32F439NI, STM32F439IG and STM32F439II Devices */ - /* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ - /* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ - /* #define STM32F410Tx */ /*!< STM32F410T8 and STM32F410TB Devices */ - /* #define STM32F410Cx */ /*!< STM32F410C8 and STM32F410CB Devices */ - /* #define STM32F410Rx */ /*!< STM32F410R8 and STM32F410RB Devices */ - /* #define STM32F411xE */ /*!< STM32F411CC, STM32F411RC, STM32F411VC, STM32F411CE, STM32F411RE and STM32F411VE Devices */ - /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC, - and STM32F446ZE Devices */ - /* #define STM32F469xx */ /*!< STM32F469AI, STM32F469II, STM32F469BI, STM32F469NI, STM32F469AG, STM32F469IG, STM32F469BG, - STM32F469NG, STM32F469AE, STM32F469IE, STM32F469BE and STM32F469NE Devices */ - /* #define STM32F479xx */ /*!< STM32F479AI, STM32F479II, STM32F479BI, STM32F479NI, STM32F479AG, STM32F479IG, STM32F479BG - and STM32F479NG Devices */ - /* #define STM32F412Cx */ /*!< STM32F412CEU and STM32F412CGU Devices */ - /* #define STM32F412Zx */ /*!< STM32F412ZET, STM32F412ZGT, STM32F412ZEJ and STM32F412ZGJ Devices */ - /* #define STM32F412Vx */ /*!< STM32F412VET, STM32F412VGT, STM32F412VEH and STM32F412VGH Devices */ - /* #define STM32F412Rx */ /*!< STM32F412RET, STM32F412RGT, STM32F412REY and STM32F412RGY Devices */ - /* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG, - STM32F413RG, STM32F413VG and STM32F413ZG Devices */ - /* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */ -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ -#if !defined (USE_HAL_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_HAL_DRIVER */ -#endif /* USE_HAL_DRIVER */ - -/** - * @brief CMSIS version number V2.6.5 - */ -#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ -#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ - |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ - |(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ - |(__STM32F4xx_CMSIS_VERSION)) - -/** - * @} - */ - -/** @addtogroup Device_Included - * @{ - */ - -#if defined(STM32F405xx) - #include "stm32f405xx.h" -#elif defined(STM32F415xx) - #include "stm32f415xx.h" -#elif defined(STM32F407xx) - #include "stm32f407xx.h" -#elif defined(STM32F417xx) - #include "stm32f417xx.h" -#elif defined(STM32F427xx) - #include "stm32f427xx.h" -#elif defined(STM32F437xx) - #include "stm32f437xx.h" -#elif defined(STM32F429xx) - #include "stm32f429xx.h" -#elif defined(STM32F439xx) - #include "stm32f439xx.h" -#elif defined(STM32F401xC) - #include "stm32f401xc.h" -#elif defined(STM32F401xE) - #include "stm32f401xe.h" -#elif defined(STM32F410Tx) - #include "stm32f410tx.h" -#elif defined(STM32F410Cx) - #include "stm32f410cx.h" -#elif defined(STM32F410Rx) - #include "stm32f410rx.h" -#elif defined(STM32F411xE) - #include "stm32f411xe.h" -#elif defined(STM32F446xx) - #include "stm32f446xx.h" -#elif defined(STM32F469xx) - #include "stm32f469xx.h" -#elif defined(STM32F479xx) - #include "stm32f479xx.h" -#elif defined(STM32F412Cx) - #include "stm32f412cx.h" -#elif defined(STM32F412Zx) - #include "stm32f412zx.h" -#elif defined(STM32F412Rx) - #include "stm32f412rx.h" -#elif defined(STM32F412Vx) - #include "stm32f412vx.h" -#elif defined(STM32F413xx) - #include "stm32f413xx.h" -#elif defined(STM32F423xx) - #include "stm32f423xx.h" -#else - #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" -#endif - -/** - * @} - */ - -/** @addtogroup Exported_types - * @{ - */ -typedef enum -{ - RESET = 0U, - SET = !RESET -} FlagStatus, ITStatus; - -typedef enum -{ - DISABLE = 0U, - ENABLE = !DISABLE -} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum -{ - SUCCESS = 0U, - ERROR = !SUCCESS -} ErrorStatus; - -/** - * @} - */ - - -/** @addtogroup Exported_macro - * @{ - */ -#define SET_BIT(REG, BIT) ((REG) |= (BIT)) - -#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) - -#define READ_BIT(REG, BIT) ((REG) & (BIT)) - -#define CLEAR_REG(REG) ((REG) = (0x0)) - -#define WRITE_REG(REG, VAL) ((REG) = (VAL)) - -#define READ_REG(REG) ((REG)) - -#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) - -#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) - - -/** - * @} - */ - -#if defined (USE_HAL_DRIVER) - #include "stm32f4xx_hal.h" -#endif /* USE_HAL_DRIVER */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __STM32F4xx_H */ -/** - * @} - */ - -/** - * @} - */ - - - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx.h + * @author MCD Application Team + * @brief CMSIS STM32F4xx Device Peripheral Access Layer Header File. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The STM32F4xx device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_HAL_DRIVER" + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx + * @{ + */ + +#ifndef __STM32F4xx_H +#define __STM32F4xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Library_configuration_section + * @{ + */ + +/** + * @brief STM32 Family + */ +#if !defined (STM32F4) +#define STM32F4 +#endif /* STM32F4 */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ +#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \ + !defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \ + !defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \ + !defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \ + !defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \ + !defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) + /* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ + /* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ + /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ + /* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ + /* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ + /* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ + /* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, + STM32F439NI, STM32F429IG and STM32F429II Devices */ + /* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, + STM32F439NI, STM32F439IG and STM32F439II Devices */ + /* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ + /* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ + /* #define STM32F410Tx */ /*!< STM32F410T8 and STM32F410TB Devices */ + /* #define STM32F410Cx */ /*!< STM32F410C8 and STM32F410CB Devices */ + /* #define STM32F410Rx */ /*!< STM32F410R8 and STM32F410RB Devices */ + /* #define STM32F411xE */ /*!< STM32F411CC, STM32F411RC, STM32F411VC, STM32F411CE, STM32F411RE and STM32F411VE Devices */ + /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC, + and STM32F446ZE Devices */ + /* #define STM32F469xx */ /*!< STM32F469AI, STM32F469II, STM32F469BI, STM32F469NI, STM32F469AG, STM32F469IG, STM32F469BG, + STM32F469NG, STM32F469AE, STM32F469IE, STM32F469BE and STM32F469NE Devices */ + /* #define STM32F479xx */ /*!< STM32F479AI, STM32F479II, STM32F479BI, STM32F479NI, STM32F479AG, STM32F479IG, STM32F479BG + and STM32F479NG Devices */ + /* #define STM32F412Cx */ /*!< STM32F412CEU and STM32F412CGU Devices */ + /* #define STM32F412Zx */ /*!< STM32F412ZET, STM32F412ZGT, STM32F412ZEJ and STM32F412ZGJ Devices */ + /* #define STM32F412Vx */ /*!< STM32F412VET, STM32F412VGT, STM32F412VEH and STM32F412VGH Devices */ + /* #define STM32F412Rx */ /*!< STM32F412RET, STM32F412RGT, STM32F412REY and STM32F412RGY Devices */ + /* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG, + STM32F413RG, STM32F413VG and STM32F413ZG Devices */ + /* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */ +#endif + +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + */ +#if !defined (USE_HAL_DRIVER) +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + /*#define USE_HAL_DRIVER */ +#endif /* USE_HAL_DRIVER */ + +/** + * @brief CMSIS version number V2.6.5 + */ +#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ +#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ + |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ + |(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ + |(__STM32F4xx_CMSIS_VERSION)) + +/** + * @} + */ + +/** @addtogroup Device_Included + * @{ + */ + +#if defined(STM32F405xx) + #include "stm32f405xx.h" +#elif defined(STM32F415xx) + #include "stm32f415xx.h" +#elif defined(STM32F407xx) + #include "stm32f407xx.h" +#elif defined(STM32F417xx) + #include "stm32f417xx.h" +#elif defined(STM32F427xx) + #include "stm32f427xx.h" +#elif defined(STM32F437xx) + #include "stm32f437xx.h" +#elif defined(STM32F429xx) + #include "stm32f429xx.h" +#elif defined(STM32F439xx) + #include "stm32f439xx.h" +#elif defined(STM32F401xC) + #include "stm32f401xc.h" +#elif defined(STM32F401xE) + #include "stm32f401xe.h" +#elif defined(STM32F410Tx) + #include "stm32f410tx.h" +#elif defined(STM32F410Cx) + #include "stm32f410cx.h" +#elif defined(STM32F410Rx) + #include "stm32f410rx.h" +#elif defined(STM32F411xE) + #include "stm32f411xe.h" +#elif defined(STM32F446xx) + #include "stm32f446xx.h" +#elif defined(STM32F469xx) + #include "stm32f469xx.h" +#elif defined(STM32F479xx) + #include "stm32f479xx.h" +#elif defined(STM32F412Cx) + #include "stm32f412cx.h" +#elif defined(STM32F412Zx) + #include "stm32f412zx.h" +#elif defined(STM32F412Rx) + #include "stm32f412rx.h" +#elif defined(STM32F412Vx) + #include "stm32f412vx.h" +#elif defined(STM32F413xx) + #include "stm32f413xx.h" +#elif defined(STM32F423xx) + #include "stm32f423xx.h" +#else + #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" +#endif + +/** + * @} + */ + +/** @addtogroup Exported_types + * @{ + */ +typedef enum +{ + RESET = 0U, + SET = !RESET +} FlagStatus, ITStatus; + +typedef enum +{ + DISABLE = 0U, + ENABLE = !DISABLE +} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum +{ + SUCCESS = 0U, + ERROR = !SUCCESS +} ErrorStatus; + +/** + * @} + */ + + +/** @addtogroup Exported_macro + * @{ + */ +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) + + +/** + * @} + */ + +#if defined (USE_HAL_DRIVER) + #include "stm32f4xx_hal.h" +#endif /* USE_HAL_DRIVER */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __STM32F4xx_H */ +/** + * @} + */ + +/** + * @} + */ + + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h index 8087ba45..99cb936c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h @@ -1,122 +1,122 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.h - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. - ****************************************************************************** - * @attention - * - *

    © COPYRIGHT(c) 2017 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. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** - * @brief Define to prevent recursive inclusion - */ -#ifndef __SYSTEM_STM32F4XX_H -#define __SYSTEM_STM32F4XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup STM32F4xx_System_Includes - * @{ - */ - -/** - * @} - */ - - -/** @addtogroup STM32F4xx_System_Exported_types - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetSysClockFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - -extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ -extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Functions - * @{ - */ - -extern void SystemInit(void); -extern void SystemCoreClockUpdate(void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__SYSTEM_STM32F4XX_H */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f4xx.h + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT(c) 2017 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32F4XX_H +#define __SYSTEM_STM32F4XX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32F4xx_System_Includes + * @{ + */ + +/** + * @} + */ + + +/** @addtogroup STM32F4xx_System_Exported_types + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetSysClockFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ +extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32F4XX_H */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h index 7d751fb3..4d9d0645 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h @@ -1,865 +1,865 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.0.4 - * @date 10. January 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use Arm Compiler Toolchain V4.0.677 or later!" -#endif - -/* CMSIS compiler control architecture macros */ -#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ - (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 -#endif - - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ - - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE static __forceinline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed)) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION __packed union -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() do {\ - __schedule_barrier();\ - __isb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() do {\ - __schedule_barrier();\ - __dsb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() do {\ - __schedule_barrier();\ - __dmb(0xF);\ - __schedule_barrier();\ - } while (0U) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return result; -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h index d8031b03..162a400e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h @@ -1,1869 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h index 79a2cac3..94212eb8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h @@ -1,266 +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 */ - +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h index 1bd41a49..2d9db15a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_gcc.h @@ -1,2085 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h index 3c90a2cd..11c4af0e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -1,935 +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__ */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h index ae3f2e33..660f612a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h @@ -1,39 +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 +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h index ec76ab21..251e4ede 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h @@ -1,1918 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h index 2d0f1067..3a3148ea 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mml.h @@ -1,2927 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h index 6f82227c..f929bba0 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h @@ -1,949 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h index b9377e8c..424011ac 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h @@ -1,1083 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h index fd1c4077..0ed678e3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm1.h @@ -1,976 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h index 8202a8dd..acbc5dfe 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm23.h @@ -1,1993 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h index b0dfbd3d..74bff64b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm3.h @@ -1,1941 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h index 02f82e29..6cd2db77 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm33.h @@ -1,3002 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h index 308b8681..7d568735 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h @@ -1,2129 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h index ada6c2a5..a14dc623 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm7.h @@ -1,2671 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h index 9086c642..9b67c92f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h @@ -1,1022 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h index 665822da..3e8a4710 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc300.h @@ -1,1915 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h index 7d4b600c..01422033 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv7.h @@ -1,270 +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 +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h index 99ee9f99..62571da5 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/mpu_armv8.h @@ -1,333 +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 - +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h index d4c1474f..0d09749f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/tz_context.h @@ -1,70 +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 +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 2d265fb6..90767ed3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -1,3776 +1,3776 @@ -/** - ****************************************************************************** - * @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) 2019 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef 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 - -/** - * @} - */ - -/** @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 */ -/** - * @} - */ - -/** @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 -/** - * @} - */ - -/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose - * @{ - */ -#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig -/** - * @} - */ - -/** @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) -#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL -#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL -#endif - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) -#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 -#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 */ - -/** - * @} - */ - -/** @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 -#define PAGESIZE FLASH_PAGE_SIZE -#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) -#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 */ - -/** - * @} - */ - -/** @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 */ -/** - * @} - */ - - -/** @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) -#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*/ - -#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 -/** - * @} - */ - -/** @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 -#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 events that can be selected to configure the - * set/reset crossbar of a timer output - */ -#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) -#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) -#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) -#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) -#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) -#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) -#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) -#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) -#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) - -#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) -#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) -#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) -#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) -#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) -#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) -#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) -#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) -#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) - -/** @brief Constants defining the event filtering applied to external events - * by a timer - */ -#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) -#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_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_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) -#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 - - -/** - * @} - */ - -/** @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(STM32H7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT - -#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_TAMPALL -#endif /* STM32H7 */ - -/** - * @} - */ - - -/** @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 - -/** - * @} - */ - -/** @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 */ - -/** - * @} - */ - -/** @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 */ - -/** @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_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(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 || 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) -#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 */ -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) -#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 */ - -#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 - - /** - * @} - */ - -/** @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 -#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 -#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(STM32L4) -#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) -#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 -#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 -#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 - -#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 - -/** - * @} - */ - -/** @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) -#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 */ - -#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 - -/** - * @} - */ - -/** @defgroup HAL_SD_Aliased_Macros HAL SD 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(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 - -/** - * @} - */ - -/** @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 -/** - * @} - */ - -/** @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) -#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE -#endif /* STM32L4 || STM32F4 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32_HAL_LEGACY */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - +/** + ****************************************************************************** + * @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) 2019 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef 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 + +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + +/** @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 +/** + * @} + */ + +/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose + * @{ + */ +#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig +/** + * @} + */ + +/** @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) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#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 +#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 */ + +/** + * @} + */ + +/** @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 +#define PAGESIZE FLASH_PAGE_SIZE +#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) +#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 */ + +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + + +/** @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) +#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*/ + +#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 +/** + * @} + */ + +/** @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 +#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 events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_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_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) +#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 + + +/** + * @} + */ + +/** @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(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#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_TAMPALL +#endif /* STM32H7 */ + +/** + * @} + */ + + +/** @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 + +/** + * @} + */ + +/** @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 */ + +/** + * @} + */ + +/** @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 */ + +/** @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_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(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 || 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) +#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 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) +#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 */ + +#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 + + /** + * @} + */ + +/** @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 +#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 +#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(STM32L4) +#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) +#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 +#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 +#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 + +#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 + +/** + * @} + */ + +/** @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) +#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 */ + +#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 + +/** + * @} + */ + +/** @defgroup HAL_SD_Aliased_Macros HAL SD 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(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 + +/** + * @} + */ + +/** @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 +/** + * @} + */ + +/** @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) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32_HAL_LEGACY */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h index 53bc3478..209864d5 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -1,298 +1,298 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_H -#define __STM32F4xx_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_conf.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup HAL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @defgroup HAL_TICK_FREQ Tick Frequency - * @{ - */ -typedef enum -{ - HAL_TICK_FREQ_10HZ = 100U, - HAL_TICK_FREQ_100HZ = 10U, - HAL_TICK_FREQ_1KHZ = 1U, - HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ -} HAL_TickFreqTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Macros HAL Exported Macros - * @{ - */ - -/** @brief Freeze/Unfreeze Peripherals in Debug mode - */ -#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -/** @brief Main Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) - -/** @brief System Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ - }while(0); - -/** @brief Embedded SRAM mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ - }while(0); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable - * @{ - */ -/** @brief SYSCFG Break Lockup lock - * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ - }while(0) -/** - * @} - */ - -/** @defgroup PVD_Lock_Enable PVD Lock - * @{ - */ -/** @brief SYSCFG Break PVD lock - * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ - }while(0) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup HAL_Private_Macros HAL Private Macros - * @{ - */ -#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ - ((FREQ) == HAL_TICK_FREQ_100HZ) || \ - ((FREQ) == HAL_TICK_FREQ_1KHZ)) -/** - * @} - */ - -/* Exported variables --------------------------------------------------------*/ - -/** @addtogroup HAL_Exported_Variables - * @{ - */ -extern __IO uint32_t uwTick; -extern uint32_t uwTickPrio; -extern HAL_TickFreqTypeDef uwTickFreq; -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_Exported_Functions - * @{ - */ -/** @addtogroup HAL_Exported_Functions_Group1 - * @{ - */ -/* Initialization and Configuration functions ******************************/ -HAL_StatusTypeDef HAL_Init(void); -HAL_StatusTypeDef HAL_DeInit(void); -void HAL_MspInit(void); -void HAL_MspDeInit(void); -HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); -/** - * @} - */ - -/** @addtogroup HAL_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_IncTick(void); -void HAL_Delay(uint32_t Delay); -uint32_t HAL_GetTick(void); -uint32_t HAL_GetTickPrio(void); -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); -HAL_TickFreqTypeDef HAL_GetTickFreq(void); -void HAL_SuspendTick(void); -void HAL_ResumeTick(void); -uint32_t HAL_GetHalVersion(void); -uint32_t HAL_GetREVID(void); -uint32_t HAL_GetDEVID(void); -void HAL_DBGMCU_EnableDBGSleepMode(void); -void HAL_DBGMCU_DisableDBGSleepMode(void); -void HAL_DBGMCU_EnableDBGStopMode(void); -void HAL_DBGMCU_DisableDBGStopMode(void); -void HAL_DBGMCU_EnableDBGStandbyMode(void); -void HAL_DBGMCU_DisableDBGStandbyMode(void); -void HAL_EnableCompensationCell(void); -void HAL_DisableCompensationCell(void); -uint32_t HAL_GetUIDw0(void); -uint32_t HAL_GetUIDw1(void); -uint32_t HAL_GetUIDw2(void); -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -void HAL_EnableMemorySwappingBank(void); -void HAL_DisableMemorySwappingBank(void); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Variables HAL Private Variables - * @{ - */ -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Constants HAL Private Constants - * @{ - */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal.h + * @author MCD Application Team + * @brief This file contains all the functions prototypes for the HAL + * module driver. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_H +#define __STM32F4xx_HAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_conf.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup HAL + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Constants HAL Exported Constants + * @{ + */ + +/** @defgroup HAL_TICK_FREQ Tick Frequency + * @{ + */ +typedef enum +{ + HAL_TICK_FREQ_10HZ = 100U, + HAL_TICK_FREQ_100HZ = 10U, + HAL_TICK_FREQ_1KHZ = 1U, + HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ +} HAL_TickFreqTypeDef; +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup HAL_Exported_Macros HAL Exported Macros + * @{ + */ + +/** @brief Freeze/Unfreeze Peripherals in Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +/** @brief Main Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) + +/** @brief System Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ + }while(0); + +/** @brief Embedded SRAM mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ + }while(0); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable + * @{ + */ +/** @brief SYSCFG Break Lockup lock + * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ + }while(0) +/** + * @} + */ + +/** @defgroup PVD_Lock_Enable PVD Lock + * @{ + */ +/** @brief SYSCFG Break PVD lock + * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ + }while(0) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup HAL_Private_Macros HAL Private Macros + * @{ + */ +#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ + ((FREQ) == HAL_TICK_FREQ_100HZ) || \ + ((FREQ) == HAL_TICK_FREQ_1KHZ)) +/** + * @} + */ + +/* Exported variables --------------------------------------------------------*/ + +/** @addtogroup HAL_Exported_Variables + * @{ + */ +extern __IO uint32_t uwTick; +extern uint32_t uwTickPrio; +extern HAL_TickFreqTypeDef uwTickFreq; +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup HAL_Exported_Functions + * @{ + */ +/** @addtogroup HAL_Exported_Functions_Group1 + * @{ + */ +/* Initialization and Configuration functions ******************************/ +HAL_StatusTypeDef HAL_Init(void); +HAL_StatusTypeDef HAL_DeInit(void); +void HAL_MspInit(void); +void HAL_MspDeInit(void); +HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); +/** + * @} + */ + +/** @addtogroup HAL_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ************************************************/ +void HAL_IncTick(void); +void HAL_Delay(uint32_t Delay); +uint32_t HAL_GetTick(void); +uint32_t HAL_GetTickPrio(void); +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); +HAL_TickFreqTypeDef HAL_GetTickFreq(void); +void HAL_SuspendTick(void); +void HAL_ResumeTick(void); +uint32_t HAL_GetHalVersion(void); +uint32_t HAL_GetREVID(void); +uint32_t HAL_GetDEVID(void); +void HAL_DBGMCU_EnableDBGSleepMode(void); +void HAL_DBGMCU_DisableDBGSleepMode(void); +void HAL_DBGMCU_EnableDBGStopMode(void); +void HAL_DBGMCU_DisableDBGStopMode(void); +void HAL_DBGMCU_EnableDBGStandbyMode(void); +void HAL_DBGMCU_DisableDBGStandbyMode(void); +void HAL_EnableCompensationCell(void); +void HAL_DisableCompensationCell(void); +uint32_t HAL_GetUIDw0(void); +uint32_t HAL_GetUIDw1(void); +uint32_t HAL_GetUIDw2(void); +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +void HAL_EnableMemorySwappingBank(void); +void HAL_DisableMemorySwappingBank(void); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Variables HAL Private Variables + * @{ + */ +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Constants HAL Private Constants + * @{ + */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h index e7b6e021..95218cfb 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h @@ -1,410 +1,410 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CORTEX_H -#define __STM32F4xx_HAL_CORTEX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CORTEX - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CORTEX_Exported_Types Cortex Exported Types - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition - * @brief MPU Region initialization structure - * @{ - */ -typedef struct -{ - uint8_t Enable; /*!< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - uint8_t Number; /*!< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ - uint8_t Size; /*!< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint8_t TypeExtField; /*!< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - uint8_t AccessPermission; /*!< Specifies the region access permission type. - This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ - uint8_t DisableExec; /*!< Specifies the instruction access status. - This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ - uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ - uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. - This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ - uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ -}MPU_Region_InitTypeDef; -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ -/** - * @} - */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U -#define SYSTICK_CLKSOURCE_HCLK 0x00000004U - -/** - * @} - */ - -#if (__MPU_PRESENT == 1) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U -#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk -#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk -#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) - -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01) -#define MPU_REGION_DISABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07) -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - - -/* Exported Macros -----------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup CORTEX_Exported_Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); -void HAL_NVIC_SystemReset(void); -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); -/** - * @} - */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -uint32_t HAL_NVIC_GetPriorityGrouping(void); -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); -void HAL_SYSTICK_IRQHandler(void); -void HAL_SYSTICK_Callback(void); - -#if (__MPU_PRESENT == 1U) -void HAL_MPU_Enable(uint32_t MPU_Control); -void HAL_MPU_Disable(void); -void HAL_MPU_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 /* __STM32F4xx_HAL_CORTEX_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CORTEX_H +#define __STM32F4xx_HAL_CORTEX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup CORTEX + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup CORTEX_Exported_Types Cortex Exported Types + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition + * @brief MPU Region initialization structure + * @{ + */ +typedef struct +{ + uint8_t Enable; /*!< Specifies the status of the region. + This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ + uint8_t Number; /*!< Specifies the number of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Number */ + uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ + uint8_t Size; /*!< Specifies the size of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Size */ + uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint8_t TypeExtField; /*!< Specifies the TEX field level. + This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ + uint8_t AccessPermission; /*!< Specifies the region access permission type. + This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ + uint8_t DisableExec; /*!< Specifies the instruction access status. + This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ + uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ + uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. + This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ + uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ +}MPU_Region_InitTypeDef; +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group + * @{ + */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ +/** + * @} + */ + +/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source + * @{ + */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U + +/** + * @} + */ + +#if (__MPU_PRESENT == 1) +/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control + * @{ + */ +#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U +#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk +#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk +#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) + +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable + * @{ + */ +#define MPU_REGION_ENABLE ((uint8_t)0x01) +#define MPU_REGION_DISABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access + * @{ + */ +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable + * @{ + */ +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable + * @{ + */ +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable + * @{ + */ +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels + * @{ + */ +#define MPU_TEX_LEVEL0 ((uint8_t)0x00) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size + * @{ + */ +#define MPU_REGION_SIZE_32B ((uint8_t)0x04) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes + * @{ + */ +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number + * @{ + */ +#define MPU_REGION_NUMBER0 ((uint8_t)0x00) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07) +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + + +/* Exported Macros -----------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CORTEX_Exported_Functions + * @{ + */ + +/** @addtogroup CORTEX_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); +void HAL_NVIC_SystemReset(void); +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); +/** + * @} + */ + +/** @addtogroup CORTEX_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +uint32_t HAL_NVIC_GetPriorityGrouping(void); +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); +void HAL_SYSTICK_IRQHandler(void); +void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_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 /* __STM32F4xx_HAL_CORTEX_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h index 8004cb6e..e32e362d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h @@ -1,197 +1,197 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_def.h - * @author MCD Application Team - * @brief This file contains HAL common defines, enumeration, macros and - * structures definitions. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DEF -#define __STM32F4xx_HAL_DEF - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "Legacy/stm32_hal_legacy.h" -#include - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HAL Status structures definition - */ -typedef enum -{ - HAL_OK = 0x00U, - HAL_ERROR = 0x01U, - HAL_BUSY = 0x02U, - HAL_TIMEOUT = 0x03U -} HAL_StatusTypeDef; - -/** - * @brief HAL Lock structures definition - */ -typedef enum -{ - HAL_UNLOCKED = 0x00U, - HAL_LOCKED = 0x01U -} HAL_LockTypeDef; - -/* Exported macro ------------------------------------------------------------*/ - -#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ - -#define HAL_MAX_DELAY 0xFFFFFFFFU - -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) - -#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ - do{ \ - (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ - (__DMA_HANDLE__).Parent = (__HANDLE__); \ - } while(0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @note This macro can be used for the following purpose: - * - When the Handle is declared as local variable; before passing it as parameter - * to HAL_PPP_Init() for the first time, it is mandatory to use this macro - * to set to 0 the Handle's "State" field. - * Otherwise, "State" field may have any random value and the first time the function - * HAL_PPP_Init() is called, the low level hardware initialization will be missed - * (i.e. HAL_PPP_MspInit() will not be executed). - * - When there is a need to reconfigure the low level hardware: instead of calling - * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). - * In this later function, when the Handle's "State" field is set to 0, it will execute the function - * HAL_PPP_MspInit() which will reconfigure the low level hardware. - * @retval None - */ -#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) - -#if (USE_RTOS == 1U) - /* Reserved for future use */ - #error "USE_RTOS should be 0 in the current HAL release" -#else - #define __HAL_LOCK(__HANDLE__) \ - do{ \ - if((__HANDLE__)->Lock == HAL_LOCKED) \ - { \ - return HAL_BUSY; \ - } \ - else \ - { \ - (__HANDLE__)->Lock = HAL_LOCKED; \ - } \ - }while (0U) - - #define __HAL_UNLOCK(__HANDLE__) \ - do{ \ - (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0U) -#endif /* USE_RTOS */ - -#if defined ( __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 ( __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 */ -#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 ) -/* ARM Compiler - ------------ - 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 ( __GNUC__ ) -/* ARM & GNUCompiler - ---------------- -*/ -#define __NOINLINE __attribute__ ( (noinline) ) - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- -*/ -#define __NOINLINE _Pragma("optimize = no_inline") - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ___STM32F4xx_HAL_DEF */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_def.h + * @author MCD Application Team + * @brief This file contains HAL common defines, enumeration, macros and + * structures definitions. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DEF +#define __STM32F4xx_HAL_DEF + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" +#include "Legacy/stm32_hal_legacy.h" +#include + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief HAL Status structures definition + */ +typedef enum +{ + HAL_OK = 0x00U, + HAL_ERROR = 0x01U, + HAL_BUSY = 0x02U, + HAL_TIMEOUT = 0x03U +} HAL_StatusTypeDef; + +/** + * @brief HAL Lock structures definition + */ +typedef enum +{ + HAL_UNLOCKED = 0x00U, + HAL_LOCKED = 0x01U +} HAL_LockTypeDef; + +/* Exported macro ------------------------------------------------------------*/ + +#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ + +#define HAL_MAX_DELAY 0xFFFFFFFFU + +#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) +#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) + +#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ + do{ \ + (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ + (__DMA_HANDLE__).Parent = (__HANDLE__); \ + } while(0U) + +/** @brief Reset the Handle's State field. + * @param __HANDLE__ specifies the Peripheral Handle. + * @note This macro can be used for the following purpose: + * - When the Handle is declared as local variable; before passing it as parameter + * to HAL_PPP_Init() for the first time, it is mandatory to use this macro + * to set to 0 the Handle's "State" field. + * Otherwise, "State" field may have any random value and the first time the function + * HAL_PPP_Init() is called, the low level hardware initialization will be missed + * (i.e. HAL_PPP_MspInit() will not be executed). + * - When there is a need to reconfigure the low level hardware: instead of calling + * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). + * In this later function, when the Handle's "State" field is set to 0, it will execute the function + * HAL_PPP_MspInit() which will reconfigure the low level hardware. + * @retval None + */ +#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) + +#if (USE_RTOS == 1U) + /* Reserved for future use */ + #error "USE_RTOS should be 0 in the current HAL release" +#else + #define __HAL_LOCK(__HANDLE__) \ + do{ \ + if((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + }while (0U) + + #define __HAL_UNLOCK(__HANDLE__) \ + do{ \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + }while (0U) +#endif /* USE_RTOS */ + +#if defined ( __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 ( __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 */ +#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 ) +/* ARM Compiler + ------------ + 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 ( __GNUC__ ) +/* ARM & GNUCompiler + ---------------- +*/ +#define __NOINLINE __attribute__ ( (noinline) ) + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- +*/ +#define __NOINLINE _Pragma("optimize = no_inline") + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ___STM32F4xx_HAL_DEF */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h index a1bccd74..90dd292c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h @@ -1,804 +1,804 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.h - * @author MCD Application Team - * @brief Header file of DMA HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_H -#define __STM32F4xx_HAL_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Types DMA Exported Types - * @brief DMA Exported Types - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_Channel_selection */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ - - uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_Memory_incremented_mode */ - - uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_Peripheral_data_size */ - - uint32_t MemDataAlignment; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_Memory_data_size */ - - uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_Priority_level */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_FIFO_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_FIFO_threshold_level */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - - -/** - * @brief HAL DMA State structures definition - */ -typedef enum -{ - HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ - HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ -}HAL_DMA_StateTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ -}HAL_DMA_LevelCompleteTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ -}HAL_DMA_CallbackIDTypeDef; - -/** - * @brief DMA handle Structure definition - */ -typedef struct __DMA_HandleTypeDef -{ - DMA_Stream_TypeDef *Instance; /*!< Register base address */ - - DMA_InitTypeDef Init; /*!< DMA communication parameters */ - - HAL_LockTypeDef Lock; /*!< DMA locking object */ - - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - - void *Parent; /*!< Parent object state */ - - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ - - void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - - __IO uint32_t ErrorCode; /*!< DMA Error code */ - - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - - uint32_t StreamIndex; /*!< DMA Stream Index */ - -}DMA_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @brief DMA Exported constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @brief DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ -#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ -/** - * @} - */ - -/** @defgroup DMA_Channel_selection DMA Channel selection - * @brief DMA channel selection - * @{ - */ -#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ -#if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction - * @brief DMA data transfer direction - * @{ - */ -#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode - * @brief DMA peripheral incremented mode - * @{ - */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode - * @brief DMA memory incremented mode - * @{ - */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size - * @brief DMA peripheral data size - * @{ - */ -#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_Memory_data_size DMA Memory data size - * @brief DMA memory data size - * @{ - */ -#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_mode DMA mode - * @brief DMA mode - * @{ - */ -#define DMA_NORMAL 0x00000000U /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_Priority_level DMA Priority level - * @brief DMA priority levels - * @{ - */ -#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode - * @brief DMA FIFO direct mode - * @{ - */ -#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level - * @brief DMA FIFO level - * @{ - */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ -#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ -#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_Memory_burst DMA Memory burst - * @brief DMA memory burst - * @{ - */ -#define DMA_MBURST_SINGLE 0x00000000U -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) -/** - * @} - */ - -/** @defgroup DMA_Peripheral_burst DMA Peripheral burst - * @brief DMA peripheral burst - * @{ - */ -#define DMA_PBURST_SINGLE 0x00000000U -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) -/** - * @} - */ - -/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions - * @brief DMA interrupts definition - * @{ - */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE 0x00000080U -/** - * @} - */ - -/** @defgroup DMA_flag_definitions DMA flag definitions - * @brief DMA flag definitions - * @{ - */ -#define DMA_FLAG_FEIF0_4 0x00000001U -#define DMA_FLAG_DMEIF0_4 0x00000004U -#define DMA_FLAG_TEIF0_4 0x00000008U -#define DMA_FLAG_HTIF0_4 0x00000010U -#define DMA_FLAG_TCIF0_4 0x00000020U -#define DMA_FLAG_FEIF1_5 0x00000040U -#define DMA_FLAG_DMEIF1_5 0x00000100U -#define DMA_FLAG_TEIF1_5 0x00000200U -#define DMA_FLAG_HTIF1_5 0x00000400U -#define DMA_FLAG_TCIF1_5 0x00000800U -#define DMA_FLAG_FEIF2_6 0x00010000U -#define DMA_FLAG_DMEIF2_6 0x00040000U -#define DMA_FLAG_TEIF2_6 0x00080000U -#define DMA_FLAG_HTIF2_6 0x00100000U -#define DMA_FLAG_TCIF2_6 0x00200000U -#define DMA_FLAG_FEIF3_7 0x00400000U -#define DMA_FLAG_DMEIF3_7 0x01000000U -#define DMA_FLAG_TEIF3_7 0x02000000U -#define DMA_FLAG_HTIF3_7 0x04000000U -#define DMA_FLAG_TCIF3_7 0x08000000U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/** @brief Reset DMA handle state - * @param __HANDLE__ specifies the DMA handle. - * @retval None - */ -#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) - -/** - * @brief Return the current DMA Stream FIFO filled level. - * @param __HANDLE__ DMA handle - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) - -/** - * @brief Enable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) - -/** - * @brief Disable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) - -/* Interrupt & Flag management */ - -/** - * @brief Return the current DMA Stream transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer complete flag index. - */ -#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ - DMA_FLAG_TCIF3_7) - -/** - * @brief Return the current DMA Stream half transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified half transfer complete flag index. - */ -#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ - DMA_FLAG_HTIF3_7) - -/** - * @brief Return the current DMA Stream transfer error flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer error flag index. - */ -#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ - DMA_FLAG_TEIF3_7) - -/** - * @brief Return the current DMA Stream FIFO error flag. - * @param __HANDLE__ DMA handle - * @retval The specified FIFO error flag index. - */ -#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ - DMA_FLAG_FEIF3_7) - -/** - * @brief Return the current DMA Stream direct mode error flag. - * @param __HANDLE__ DMA handle - * @retval The specified direct mode error flag index. - */ -#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ - DMA_FLAG_DMEIF3_7) - -/** - * @brief Get the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) - -/** - * @brief Clear the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval None - */ -#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) - -/** - * @brief Enable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) - -/** - * @brief Disable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) - -/** - * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval The state of DMA_IT. - */ -#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ - ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ - ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) - -/** - * @brief Writes the number of data units to be transferred on the DMA Stream. - * @param __HANDLE__ DMA handle - * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param __HANDLE__ DMA handle - * - * @retval The number of remaining data units in the current DMA Stream transfer. - */ -#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) - - -/* Include DMA HAL Extension module */ -#include "stm32f4xx_hal_dma_ex.h" - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Functions DMA Exported Functions - * @brief DMA Exported functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions - * @brief I/O operation functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/** - * @} - */ -/* Private Constants -------------------------------------------------------------*/ -/** @defgroup DMA_Private_Constants DMA Private Constants - * @brief DMA private defines and constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macros DMA Private Macros - * @brief DMA private macros - * @{ - */ -#if defined (DMA_SxCR_CHSEL_3) -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7) || \ - ((CHANNEL) == DMA_CHANNEL_8) || \ - ((CHANNEL) == DMA_CHANNEL_9) || \ - ((CHANNEL) == DMA_CHANNEL_10)|| \ - ((CHANNEL) == DMA_CHANNEL_11)|| \ - ((CHANNEL) == DMA_CHANNEL_12)|| \ - ((CHANNEL) == DMA_CHANNEL_13)|| \ - ((CHANNEL) == DMA_CHANNEL_14)|| \ - ((CHANNEL) == DMA_CHANNEL_15)) -#else -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7)) -#endif /* DMA_SxCR_CHSEL_3 */ - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ - ((STATE) == DMA_PINC_DISABLE)) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ - ((STATE) == DMA_MINC_DISABLE)) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ - ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_PDATAALIGN_WORD)) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ - ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_MDATAALIGN_WORD )) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ - ((MODE) == DMA_CIRCULAR) || \ - ((MODE) == DMA_PFCTRL)) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ - ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || \ - ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ - ((STATE) == DMA_FIFOMODE_ENABLE)) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ - ((BURST) == DMA_MBURST_INC4) || \ - ((BURST) == DMA_MBURST_INC8) || \ - ((BURST) == DMA_MBURST_INC16)) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ - ((BURST) == DMA_PBURST_INC4) || \ - ((BURST) == DMA_PBURST_INC8) || \ - ((BURST) == DMA_PBURST_INC16)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMA_Private_Functions DMA Private Functions - * @brief DMA private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_DMA_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma.h + * @author MCD Application Team + * @brief Header file of DMA HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_H +#define __STM32F4xx_HAL_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Types DMA Exported Types + * @brief DMA Exported Types + * @{ + */ + +/** + * @brief DMA Configuration Structure definition + */ +typedef struct +{ + uint32_t Channel; /*!< Specifies the channel used for the specified stream. + This parameter can be a value of @ref DMA_Channel_selection */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_Data_transfer_direction */ + + uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. + This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ + + uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. + This parameter can be a value of @ref DMA_Memory_incremented_mode */ + + uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_Peripheral_data_size */ + + uint32_t MemDataAlignment; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_Memory_data_size */ + + uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. + This parameter can be a value of @ref DMA_mode + @note The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Stream */ + + uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. + This parameter can be a value of @ref DMA_Priority_level */ + + uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. + This parameter can be a value of @ref DMA_FIFO_direct_mode + @note The Direct mode (FIFO mode disabled) cannot be used if the + memory-to-memory data transfer is configured on the selected stream */ + + uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. + This parameter can be a value of @ref DMA_FIFO_threshold_level */ + + uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Memory_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ + + uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Peripheral_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ +}DMA_InitTypeDef; + + +/** + * @brief HAL DMA State structures definition + */ +typedef enum +{ + HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ + HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ + HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ + HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ + HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ + HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ +}HAL_DMA_StateTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ + HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ +}HAL_DMA_LevelCompleteTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ + HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ + HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ + HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ + HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ + HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ + HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ +}HAL_DMA_CallbackIDTypeDef; + +/** + * @brief DMA handle Structure definition + */ +typedef struct __DMA_HandleTypeDef +{ + DMA_Stream_TypeDef *Instance; /*!< Register base address */ + + DMA_InitTypeDef Init; /*!< DMA communication parameters */ + + HAL_LockTypeDef Lock; /*!< DMA locking object */ + + __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ + + void *Parent; /*!< Parent object state */ + + void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ + + void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ + + void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ + + void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ + + void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ + + void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ + + __IO uint32_t ErrorCode; /*!< DMA Error code */ + + uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ + + uint32_t StreamIndex; /*!< DMA Stream Index */ + +}DMA_HandleTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Constants DMA Exported Constants + * @brief DMA Exported constants + * @{ + */ + +/** @defgroup DMA_Error_Code DMA Error Code + * @brief DMA Error Code + * @{ + */ +#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ +#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ +#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ +#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ +#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ +/** + * @} + */ + +/** @defgroup DMA_Channel_selection DMA Channel selection + * @brief DMA channel selection + * @{ + */ +#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ +#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ +#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ +#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ +#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ +#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ +#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ +#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ +#if defined (DMA_SxCR_CHSEL_3) +#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ +#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ +#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ +#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ +#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ +#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ +#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ +#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ +#endif /* DMA_SxCR_CHSEL_3 */ +/** + * @} + */ + +/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction + * @brief DMA data transfer direction + * @{ + */ +#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ +#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode + * @brief DMA peripheral incremented mode + * @{ + */ +#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ +#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode + * @brief DMA memory incremented mode + * @{ + */ +#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ +#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size + * @brief DMA peripheral data size + * @{ + */ +#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ +#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ +#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_Memory_data_size DMA Memory data size + * @brief DMA memory data size + * @{ + */ +#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ +#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ +#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_mode DMA mode + * @brief DMA mode + * @{ + */ +#define DMA_NORMAL 0x00000000U /*!< Normal mode */ +#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ +#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ +/** + * @} + */ + +/** @defgroup DMA_Priority_level DMA Priority level + * @brief DMA priority levels + * @{ + */ +#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ +#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ +#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ +#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode + * @brief DMA FIFO direct mode + * @{ + */ +#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ +#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level + * @brief DMA FIFO level + * @{ + */ +#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ +#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ +#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ +#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ +/** + * @} + */ + +/** @defgroup DMA_Memory_burst DMA Memory burst + * @brief DMA memory burst + * @{ + */ +#define DMA_MBURST_SINGLE 0x00000000U +#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) +#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) +#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) +/** + * @} + */ + +/** @defgroup DMA_Peripheral_burst DMA Peripheral burst + * @brief DMA peripheral burst + * @{ + */ +#define DMA_PBURST_SINGLE 0x00000000U +#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) +#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) +#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) +/** + * @} + */ + +/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions + * @brief DMA interrupts definition + * @{ + */ +#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) +#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) +#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) +#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) +#define DMA_IT_FE 0x00000080U +/** + * @} + */ + +/** @defgroup DMA_flag_definitions DMA flag definitions + * @brief DMA flag definitions + * @{ + */ +#define DMA_FLAG_FEIF0_4 0x00000001U +#define DMA_FLAG_DMEIF0_4 0x00000004U +#define DMA_FLAG_TEIF0_4 0x00000008U +#define DMA_FLAG_HTIF0_4 0x00000010U +#define DMA_FLAG_TCIF0_4 0x00000020U +#define DMA_FLAG_FEIF1_5 0x00000040U +#define DMA_FLAG_DMEIF1_5 0x00000100U +#define DMA_FLAG_TEIF1_5 0x00000200U +#define DMA_FLAG_HTIF1_5 0x00000400U +#define DMA_FLAG_TCIF1_5 0x00000800U +#define DMA_FLAG_FEIF2_6 0x00010000U +#define DMA_FLAG_DMEIF2_6 0x00040000U +#define DMA_FLAG_TEIF2_6 0x00080000U +#define DMA_FLAG_HTIF2_6 0x00100000U +#define DMA_FLAG_TCIF2_6 0x00200000U +#define DMA_FLAG_FEIF3_7 0x00400000U +#define DMA_FLAG_DMEIF3_7 0x01000000U +#define DMA_FLAG_TEIF3_7 0x02000000U +#define DMA_FLAG_HTIF3_7 0x04000000U +#define DMA_FLAG_TCIF3_7 0x08000000U +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/** @brief Reset DMA handle state + * @param __HANDLE__ specifies the DMA handle. + * @retval None + */ +#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) + +/** + * @brief Return the current DMA Stream FIFO filled level. + * @param __HANDLE__ DMA handle + * @retval The FIFO filling state. + * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full + * and not empty. + * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. + * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. + * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. + * - DMA_FIFOStatus_Empty: when FIFO is empty + * - DMA_FIFOStatus_Full: when FIFO is full + */ +#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) + +/** + * @brief Enable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) + +/** + * @brief Disable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) + +/* Interrupt & Flag management */ + +/** + * @brief Return the current DMA Stream transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer complete flag index. + */ +#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ + DMA_FLAG_TCIF3_7) + +/** + * @brief Return the current DMA Stream half transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified half transfer complete flag index. + */ +#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ + DMA_FLAG_HTIF3_7) + +/** + * @brief Return the current DMA Stream transfer error flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer error flag index. + */ +#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ + DMA_FLAG_TEIF3_7) + +/** + * @brief Return the current DMA Stream FIFO error flag. + * @param __HANDLE__ DMA handle + * @retval The specified FIFO error flag index. + */ +#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ + DMA_FLAG_FEIF3_7) + +/** + * @brief Return the current DMA Stream direct mode error flag. + * @param __HANDLE__ DMA handle + * @retval The specified direct mode error flag index. + */ +#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ + DMA_FLAG_DMEIF3_7) + +/** + * @brief Get the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ Get the specified flag. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval The state of FLAG (SET or RESET). + */ +#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) + +/** + * @brief Clear the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval None + */ +#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) + +/** + * @brief Enable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) + +/** + * @brief Disable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) + +/** + * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval The state of DMA_IT. + */ +#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ + ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ + ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) + +/** + * @brief Writes the number of data units to be transferred on the DMA Stream. + * @param __HANDLE__ DMA handle + * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) + * Number of data items depends only on the Peripheral data format. + * + * @note If Peripheral data format is Bytes: number of data units is equal + * to total number of bytes to be transferred. + * + * @note If Peripheral data format is Half-Word: number of data units is + * equal to total number of bytes to be transferred / 2. + * + * @note If Peripheral data format is Word: number of data units is equal + * to total number of bytes to be transferred / 4. + * + * @retval The number of remaining data units in the current DMAy Streamx transfer. + */ +#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) + +/** + * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. + * @param __HANDLE__ DMA handle + * + * @retval The number of remaining data units in the current DMA Stream transfer. + */ +#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) + + +/* Include DMA HAL Extension module */ +#include "stm32f4xx_hal_dma_ex.h" + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Functions DMA Exported Functions + * @brief DMA Exported functions + * @{ + */ + +/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions + * @brief I/O operation functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/** + * @} + */ +/* Private Constants -------------------------------------------------------------*/ +/** @defgroup DMA_Private_Constants DMA Private Constants + * @brief DMA private defines and constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DMA_Private_Macros DMA Private Macros + * @brief DMA private macros + * @{ + */ +#if defined (DMA_SxCR_CHSEL_3) +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7) || \ + ((CHANNEL) == DMA_CHANNEL_8) || \ + ((CHANNEL) == DMA_CHANNEL_9) || \ + ((CHANNEL) == DMA_CHANNEL_10)|| \ + ((CHANNEL) == DMA_CHANNEL_11)|| \ + ((CHANNEL) == DMA_CHANNEL_12)|| \ + ((CHANNEL) == DMA_CHANNEL_13)|| \ + ((CHANNEL) == DMA_CHANNEL_14)|| \ + ((CHANNEL) == DMA_CHANNEL_15)) +#else +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7)) +#endif /* DMA_SxCR_CHSEL_3 */ + +#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ + ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ + ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) + +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ + ((STATE) == DMA_PINC_DISABLE)) + +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ + ((STATE) == DMA_MINC_DISABLE)) + +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ + ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_PDATAALIGN_WORD)) + +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ + ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_MDATAALIGN_WORD )) + +#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ + ((MODE) == DMA_CIRCULAR) || \ + ((MODE) == DMA_PFCTRL)) + +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ + ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ + ((PRIORITY) == DMA_PRIORITY_HIGH) || \ + ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) + +#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ + ((STATE) == DMA_FIFOMODE_ENABLE)) + +#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) + +#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ + ((BURST) == DMA_MBURST_INC4) || \ + ((BURST) == DMA_MBURST_INC8) || \ + ((BURST) == DMA_MBURST_INC16)) + +#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ + ((BURST) == DMA_PBURST_INC4) || \ + ((BURST) == DMA_PBURST_INC8) || \ + ((BURST) == DMA_PBURST_INC16)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMA_Private_Functions DMA Private Functions + * @brief DMA private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_DMA_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h index 369f5279..2e60aff2 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h @@ -1,104 +1,104 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.h - * @author MCD Application Team - * @brief Header file of DMA HAL extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_EX_H -#define __STM32F4xx_HAL_DMA_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMAEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Types DMAEx Exported Types - * @brief DMAEx Exported types - * @{ - */ - -/** - * @brief HAL DMA Memory definition - */ -typedef enum -{ - MEMORY0 = 0x00U, /*!< Memory 0 */ - MEMORY1 = 0x01U /*!< Memory 1 */ -}HAL_DMA_MemoryTypeDef; - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions - * @brief DMAEx Exported functions - * @{ - */ - -/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); - -/** - * @} - */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMAEx_Private_Functions DMAEx Private Functions - * @brief DMAEx Private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HAL_DMA_EX_H*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.h + * @author MCD Application Team + * @brief Header file of DMA HAL extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_EX_H +#define __STM32F4xx_HAL_DMA_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMAEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Types DMAEx Exported Types + * @brief DMAEx Exported types + * @{ + */ + +/** + * @brief HAL DMA Memory definition + */ +typedef enum +{ + MEMORY0 = 0x00U, /*!< Memory 0 */ + MEMORY1 = 0x01U /*!< Memory 1 */ +}HAL_DMA_MemoryTypeDef; + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions + * @brief DMAEx Exported functions + * @{ + */ + +/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions + * @brief Extended features functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); + +/** + * @} + */ +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMAEx_Private_Functions DMAEx Private Functions + * @brief DMAEx Private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F4xx_HAL_DMA_EX_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h index 73bb134e..ff74222e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h @@ -1,368 +1,368 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.h - * @author MCD Application Team - * @brief Header file of EXTI HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2018 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32f4xx_HAL_EXTI_H -#define STM32f4xx_HAL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup EXTI EXTI - * @brief EXTI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Types EXTI Exported Types - * @{ - */ -typedef enum -{ - HAL_EXTI_COMMON_CB_ID = 0x00U -} EXTI_CallbackIDTypeDef; - -/** - * @brief EXTI Handle structure definition - */ -typedef struct -{ - uint32_t Line; /*!< Exti line number */ - void (* PendingCallback)(void); /*!< Exti pending callback */ -} EXTI_HandleTypeDef; - -/** - * @brief EXTI Configuration structure definition - */ -typedef struct -{ - uint32_t Line; /*!< The Exti line to be configured. This parameter - can be a value of @ref EXTI_Line */ - uint32_t Mode; /*!< The Exit Mode to be configured for a core. - This parameter can be a combination of @ref EXTI_Mode */ - uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter - can be a value of @ref EXTI_Trigger */ - uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. - This parameter is only possible for line 0 to 15. It - can be a value of @ref EXTI_GPIOSel */ -} EXTI_ConfigTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_Line EXTI Line - * @{ - */ -#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ -#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ -#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ -#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ -#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ -#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ -#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ -#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ -#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ -#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ -#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ -#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ -#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ -#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ -#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ -#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ -#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#else -#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#else -#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#else -#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM20 */ -#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/** @defgroup EXTI_Mode EXTI Mode - * @{ - */ -#define EXTI_MODE_NONE 0x00000000u -#define EXTI_MODE_INTERRUPT 0x00000001u -#define EXTI_MODE_EVENT 0x00000002u -/** - * @} - */ - -/** @defgroup EXTI_Trigger EXTI Trigger - * @{ - */ - -#define EXTI_TRIGGER_NONE 0x00000000u -#define EXTI_TRIGGER_RISING 0x00000001u -#define EXTI_TRIGGER_FALLING 0x00000002u -#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) -/** - * @} - */ - -/** @defgroup EXTI_GPIOSel EXTI GPIOSel - * @brief - * @{ - */ -#define EXTI_GPIOA 0x00000000u -#define EXTI_GPIOB 0x00000001u -#define EXTI_GPIOC 0x00000002u -#if defined (GPIOD) -#define EXTI_GPIOD 0x00000003u -#endif /* GPIOD */ -#if defined (GPIOE) -#define EXTI_GPIOE 0x00000004u -#endif /* GPIOE */ -#if defined (GPIOF) -#define EXTI_GPIOF 0x00000005u -#endif /* GPIOF */ -#if defined (GPIOG) -#define EXTI_GPIOG 0x00000006u -#endif /* GPIOG */ -#if defined (GPIOH) -#define EXTI_GPIOH 0x00000007u -#endif /* GPIOH */ -#if defined (GPIOI) -#define EXTI_GPIOI 0x00000008u -#endif /* GPIOI */ -#if defined (GPIOJ) -#define EXTI_GPIOJ 0x00000009u -#endif /* GPIOJ */ -#if defined (GPIOK) -#define EXTI_GPIOK 0x0000000Au -#endif /* GPIOK */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** - * @} - */ - -/* Private constants --------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ -/** - * @brief EXTI Line property definition - */ -#define EXTI_PROPERTY_SHIFT 24u -#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) -#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) -#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) -#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) - -/** - * @brief EXTI bit usage - */ -#define EXTI_PIN_MASK 0x0000001Fu - -/** - * @brief EXTI Mask for interrupt & event mode - */ -#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) - -/** - * @brief EXTI Mask for trigger possibilities - */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) - -/** - * @brief EXTI Line number - */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_NB 24UL -#else -#define EXTI_LINE_NB 23UL -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup EXTI_Private_Macros EXTI Private Macros - * @{ - */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ - ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ - (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ - (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) - -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ - (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) - -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) - -#define IS_EXTI_PENDING_EDGE(__LINE__) ((__LINE__) == EXTI_TRIGGER_RISING_FALLING) - -#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) - -#if !defined (GPIOD) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOE) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOF) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOI) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOJ) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI)) -#else -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI) || \ - ((__PORT__) == EXTI_GPIOJ) || \ - ((__PORT__) == EXTI_GPIOK)) -#endif /* GPIOD */ - -#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Functions EXTI Exported Functions - * @brief EXTI Exported Functions - * @{ - */ - -/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions - * @brief Configuration functions - * @{ - */ -/* Configuration functions ****************************************************/ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32f4xx_HAL_EXTI_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.h + * @author MCD Application Team + * @brief Header file of EXTI HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32f4xx_HAL_EXTI_H +#define STM32f4xx_HAL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup EXTI EXTI + * @brief EXTI HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup EXTI_Exported_Types EXTI Exported Types + * @{ + */ +typedef enum +{ + HAL_EXTI_COMMON_CB_ID = 0x00U +} EXTI_CallbackIDTypeDef; + +/** + * @brief EXTI Handle structure definition + */ +typedef struct +{ + uint32_t Line; /*!< Exti line number */ + void (* PendingCallback)(void); /*!< Exti pending callback */ +} EXTI_HandleTypeDef; + +/** + * @brief EXTI Configuration structure definition + */ +typedef struct +{ + uint32_t Line; /*!< The Exti line to be configured. This parameter + can be a value of @ref EXTI_Line */ + uint32_t Mode; /*!< The Exit Mode to be configured for a core. + This parameter can be a combination of @ref EXTI_Mode */ + uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter + can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ +} EXTI_ConfigTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Constants EXTI Exported Constants + * @{ + */ + +/** @defgroup EXTI_Line EXTI Line + * @{ + */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#if defined(EXTI_IMR_IM18) +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#else +#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM18 */ +#if defined(EXTI_IMR_IM19) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM19 */ +#if defined(EXTI_IMR_IM20) +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#else +#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM20 */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/** @defgroup EXTI_Mode EXTI Mode + * @{ + */ +#define EXTI_MODE_NONE 0x00000000u +#define EXTI_MODE_INTERRUPT 0x00000001u +#define EXTI_MODE_EVENT 0x00000002u +/** + * @} + */ + +/** @defgroup EXTI_Trigger EXTI Trigger + * @{ + */ + +#define EXTI_TRIGGER_NONE 0x00000000u +#define EXTI_TRIGGER_RISING 0x00000001u +#define EXTI_TRIGGER_FALLING 0x00000002u +#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) +/** + * @} + */ + +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#if defined (GPIOD) +#define EXTI_GPIOD 0x00000003u +#endif /* GPIOD */ +#if defined (GPIOE) +#define EXTI_GPIOE 0x00000004u +#endif /* GPIOE */ +#if defined (GPIOF) +#define EXTI_GPIOF 0x00000005u +#endif /* GPIOF */ +#if defined (GPIOG) +#define EXTI_GPIOG 0x00000006u +#endif /* GPIOG */ +#if defined (GPIOH) +#define EXTI_GPIOH 0x00000007u +#endif /* GPIOH */ +#if defined (GPIOI) +#define EXTI_GPIOI 0x00000008u +#endif /* GPIOI */ +#if defined (GPIOJ) +#define EXTI_GPIOJ 0x00000009u +#endif /* GPIOJ */ +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Macros EXTI Exported Macros + * @{ + */ + +/** + * @} + */ + +/* Private constants --------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + +/** + * @brief EXTI Mask for interrupt & event mode + */ +#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) + +/** + * @brief EXTI Mask for trigger possibilities + */ +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) + +/** + * @brief EXTI Line number + */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_NB 24UL +#else +#define EXTI_LINE_NB 23UL +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup EXTI_Private_Macros EXTI Private Macros + * @{ + */ +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) + +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) + +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) + +#define IS_EXTI_PENDING_EDGE(__LINE__) ((__LINE__) == EXTI_TRIGGER_RISING_FALLING) + +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if !defined (GPIOD) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOE) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOF) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOI) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOJ) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#endif /* GPIOD */ + +#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Functions EXTI Exported Functions + * @brief EXTI Exported Functions + * @{ + */ + +/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions + * @brief Configuration functions + * @{ + */ +/* Configuration functions ****************************************************/ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * @{ + */ +/* IO operation functions *****************************************************/ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32f4xx_HAL_EXTI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h index 53666ac0..b817f63b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h @@ -1,428 +1,428 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.h - * @author MCD Application Team - * @brief Header file of FLASH HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_H -#define __STM32F4xx_HAL_FLASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Procedure structure definition - */ -typedef enum -{ - FLASH_PROC_NONE = 0U, - FLASH_PROC_SECTERASE, - FLASH_PROC_MASSERASE, - FLASH_PROC_PROGRAM -} FLASH_ProcedureTypeDef; - -/** - * @brief FLASH handle Structure definition - */ -typedef struct -{ - __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ - - __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ - - __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ - - __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ - - __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ - - __IO uint32_t Address; /*Internal variable to save address selected for program*/ - - HAL_LockTypeDef Lock; /* FLASH locking object */ - - __IO uint32_t ErrorCode; /* FLASH error code */ - -}FLASH_ProcessTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Constants FLASH Exported Constants - * @{ - */ -/** @defgroup FLASH_Error_Code FLASH Error Code - * @brief FLASH Error Code - * @{ - */ -#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ -/** - * @} - */ - -/** @defgroup FLASH_Type_Program FLASH Type Program - * @{ - */ -#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ -/** - * @} - */ - -/** @defgroup FLASH_Flag_definition FLASH Flag definition - * @brief Flag definition - * @{ - */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#if defined(FLASH_SR_RDERR) -#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ -#endif /* FLASH_SR_RDERR */ -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -/** - * @} - */ - -/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition - * @brief FLASH Interrupt definition - * @{ - */ -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE 0x00000000U -#define FLASH_PSIZE_HALF_WORD 0x00000100U -#define FLASH_PSIZE_WORD 0x00000200U -#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U -#define CR_PSIZE_MASK 0xFFFFFCFFU -/** - * @} - */ - -/** @defgroup FLASH_Keys FLASH Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 0x45670123U -#define FLASH_KEY2 0xCDEF89ABU -#define FLASH_OPT_KEY1 0x08192A3BU -#define FLASH_OPT_KEY2 0x4C5D6E7FU -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Macros FLASH Exported Macros - * @{ - */ -/** - * @brief Set the FLASH Latency. - * @param __LATENCY__ FLASH Latency - * The value of this parameter depend on device used within the same series - * @retval none - */ -#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) - -/** - * @brief Get the FLASH Latency. - * @retval FLASH Latency - * The value of this parameter depend on device used within the same series - */ -#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) - -/** - * @brief Enable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) - -/** - * @brief Disable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) - -/** - * @brief Enable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) - -/** - * @brief Disable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) - -/** - * @brief Enable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) - -/** - * @brief Disable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) - -/** - * @brief Resets the FLASH instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ - FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0U) - -/** - * @brief Resets the FLASH data Cache. - * @note This function must be used only when the data Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ - FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0U) -/** - * @brief Enable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) - -/** - * @brief Get the specified FLASH flag status. - * @param __FLAG__ specifies the FLASH flags to check. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * @arg FLASH_FLAG_BSY : FLASH Busy flag - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval The new state of __FLAG__ (SET or RESET). - */ -#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) - -/** - * @brief Clear the specified FLASH flags. - * @param __FLAG__ specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval none - */ -#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) -/** - * @} - */ - -/* Include FLASH HAL Extension module */ -#include "stm32f4xx_hal_flash_ex.h" -#include "stm32f4xx_hal_flash_ramfunc.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_Exported_Functions - * @{ - */ -/** @addtogroup FLASH_Exported_Functions_Group1 - * @{ - */ -/* Program operation functions ***********************************************/ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -/* FLASH IRQ handler method */ -void HAL_FLASH_IRQHandler(void); -/* Callbacks in non blocking modes */ -void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); -void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions **********************************************/ -HAL_StatusTypeDef HAL_FLASH_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_Lock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); -/* Option bytes control */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -uint32_t HAL_FLASH_GetError(void); -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Variables FLASH Private Variables - * @{ - */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Constants FLASH Private Constants - * @{ - */ - -/** - * @brief ACR register byte 0 (Bits[7:0]) base address - */ -#define ACR_BYTE0_ADDRESS 0x40023C00U -/** - * @brief OPTCR register byte 0 (Bits[7:0]) base address - */ -#define OPTCR_BYTE0_ADDRESS 0x40023C14U -/** - * @brief OPTCR register byte 1 (Bits[15:8]) base address - */ -#define OPTCR_BYTE1_ADDRESS 0x40023C15U -/** - * @brief OPTCR register byte 2 (Bits[23:16]) base address - */ -#define OPTCR_BYTE2_ADDRESS 0x40023C16U -/** - * @brief OPTCR register byte 3 (Bits[31:24]) base address - */ -#define OPTCR_BYTE3_ADDRESS 0x40023C17U - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup FLASH_Private_Macros FLASH Private Macros - * @{ - */ - -/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters - * @{ - */ -#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ - ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Functions FLASH Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.h + * @author MCD Application Team + * @brief Header file of FLASH HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_H +#define __STM32F4xx_HAL_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Procedure structure definition + */ +typedef enum +{ + FLASH_PROC_NONE = 0U, + FLASH_PROC_SECTERASE, + FLASH_PROC_MASSERASE, + FLASH_PROC_PROGRAM +} FLASH_ProcedureTypeDef; + +/** + * @brief FLASH handle Structure definition + */ +typedef struct +{ + __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ + + __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ + + __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ + + __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ + + __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ + + __IO uint32_t Address; /*Internal variable to save address selected for program*/ + + HAL_LockTypeDef Lock; /* FLASH locking object */ + + __IO uint32_t ErrorCode; /* FLASH error code */ + +}FLASH_ProcessTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Constants FLASH Exported Constants + * @{ + */ +/** @defgroup FLASH_Error_Code FLASH Error Code + * @brief FLASH Error Code + * @{ + */ +#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ +#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ +#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ +#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ +#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ +#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ +/** + * @} + */ + +/** @defgroup FLASH_Type_Program FLASH Type Program + * @{ + */ +#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ +/** + * @} + */ + +/** @defgroup FLASH_Flag_definition FLASH Flag definition + * @brief Flag definition + * @{ + */ +#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ +#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ +#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ +#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ +#if defined(FLASH_SR_RDERR) +#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ +#endif /* FLASH_SR_RDERR */ +#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ +/** + * @} + */ + +/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition + * @brief FLASH Interrupt definition + * @{ + */ +#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ +#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ +/** + * @} + */ + +/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism + * @{ + */ +#define FLASH_PSIZE_BYTE 0x00000000U +#define FLASH_PSIZE_HALF_WORD 0x00000100U +#define FLASH_PSIZE_WORD 0x00000200U +#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U +#define CR_PSIZE_MASK 0xFFFFFCFFU +/** + * @} + */ + +/** @defgroup FLASH_Keys FLASH Keys + * @{ + */ +#define RDP_KEY ((uint16_t)0x00A5) +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +#define FLASH_OPT_KEY1 0x08192A3BU +#define FLASH_OPT_KEY2 0x4C5D6E7FU +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Macros FLASH Exported Macros + * @{ + */ +/** + * @brief Set the FLASH Latency. + * @param __LATENCY__ FLASH Latency + * The value of this parameter depend on device used within the same series + * @retval none + */ +#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) + +/** + * @brief Get the FLASH Latency. + * @retval FLASH Latency + * The value of this parameter depend on device used within the same series + */ +#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) + +/** + * @brief Enable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) + +/** + * @brief Disable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) + +/** + * @brief Enable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) + +/** + * @brief Disable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) + +/** + * @brief Enable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) + +/** + * @brief Disable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) + +/** + * @brief Resets the FLASH instruction Cache. + * @note This function must be used only when the Instruction Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ + FLASH->ACR &= ~FLASH_ACR_ICRST; \ + }while(0U) + +/** + * @brief Resets the FLASH data Cache. + * @note This function must be used only when the data Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ + FLASH->ACR &= ~FLASH_ACR_DCRST; \ + }while(0U) +/** + * @brief Enable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) + +/** + * @brief Disable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) + +/** + * @brief Get the specified FLASH flag status. + * @param __FLAG__ specifies the FLASH flags to check. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * @arg FLASH_FLAG_BSY : FLASH Busy flag + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) + +/** + * @brief Clear the specified FLASH flags. + * @param __FLAG__ specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval none + */ +#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) +/** + * @} + */ + +/* Include FLASH HAL Extension module */ +#include "stm32f4xx_hal_flash_ex.h" +#include "stm32f4xx_hal_flash_ramfunc.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_Exported_Functions + * @{ + */ +/** @addtogroup FLASH_Exported_Functions_Group1 + * @{ + */ +/* Program operation functions ***********************************************/ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +/* FLASH IRQ handler method */ +void HAL_FLASH_IRQHandler(void); +/* Callbacks in non blocking modes */ +void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); +void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions **********************************************/ +HAL_StatusTypeDef HAL_FLASH_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_Lock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); +/* Option bytes control */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State functions ************************************************/ +uint32_t HAL_FLASH_GetError(void); +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Variables FLASH Private Variables + * @{ + */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Constants FLASH Private Constants + * @{ + */ + +/** + * @brief ACR register byte 0 (Bits[7:0]) base address + */ +#define ACR_BYTE0_ADDRESS 0x40023C00U +/** + * @brief OPTCR register byte 0 (Bits[7:0]) base address + */ +#define OPTCR_BYTE0_ADDRESS 0x40023C14U +/** + * @brief OPTCR register byte 1 (Bits[15:8]) base address + */ +#define OPTCR_BYTE1_ADDRESS 0x40023C15U +/** + * @brief OPTCR register byte 2 (Bits[23:16]) base address + */ +#define OPTCR_BYTE2_ADDRESS 0x40023C16U +/** + * @brief OPTCR register byte 3 (Bits[31:24]) base address + */ +#define OPTCR_BYTE3_ADDRESS 0x40023C17U + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FLASH_Private_Macros FLASH Private Macros + * @{ + */ + +/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters + * @{ + */ +#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ + ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Functions FLASH Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h index 60559aef..4dbad673 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h @@ -1,1066 +1,1066 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.h - * @author MCD Application Team - * @brief Header file of FLASH HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_EX_H -#define __STM32F4xx_HAL_FLASH_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASHEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Erase structure definition - */ -typedef struct -{ - uint32_t TypeErase; /*!< Mass erase or sector Erase. - This parameter can be a value of @ref FLASHEx_Type_Erase */ - - uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled - This parameter must be a value of @ref FLASHEx_Sectors */ - - uint32_t NbSectors; /*!< Number of sectors to be erased. - This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ - - uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism - This parameter must be a value of @ref FLASHEx_Voltage_Range */ - -} FLASH_EraseInitTypeDef; - -/** - * @brief FLASH Option Bytes Program structure definition - */ -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured. - This parameter can be a value of @ref FLASHEx_Option_Type */ - - uint32_t WRPState; /*!< Write protection activation or deactivation. - This parameter can be a value of @ref FLASHEx_WRP_State */ - - uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. - The value of this parameter depend on device used within the same series */ - - uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t RDPLevel; /*!< Set the read protection level. - This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ - - uint32_t BORLevel; /*!< Set the BOR Level. - This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ - - uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ - -} FLASH_OBProgramInitTypeDef; - -/** - * @brief FLASH Advanced Option Bytes Program structure definition - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured for extension. - This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ - - uint32_t PCROPState; /*!< PCROP activation or deactivation. - This parameter can be a value of @ref FLASHEx_PCROP_State */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint8_t BootConfig; /*!< Specifies Option bytes for boot config. - This parameter can be a value of @ref FLASHEx_Dual_Boot */ - -#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -}FLASH_AdvOBProgramInitTypeDef; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants - * @{ - */ - -/** @defgroup FLASHEx_Type_Erase FLASH Type Erase - * @{ - */ -#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ -/** - * @} - */ - -/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range - * @{ - */ -#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ -/** - * @} - */ - -/** @defgroup FLASHEx_WRP_State FLASH WRP State - * @{ - */ -#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Type FLASH Option Type - * @{ - */ -#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection - * @{ - */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 - it s no more possible to go back to level 1 or 0 */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP - * @{ - */ -#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -/** - * @} - */ - - -/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY - * @{ - */ -#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -/** - * @} - */ - -/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup FLASHEx_PCROP_State FLASH PCROP State - * @{ - */ -#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ - (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) - -#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASHEx_Private_Functions FLASH Private Functions - * @{ - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); -void FLASH_FlushCaches(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.h + * @author MCD Application Team + * @brief Header file of FLASH HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_EX_H +#define __STM32F4xx_HAL_FLASH_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASHEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Erase structure definition + */ +typedef struct +{ + uint32_t TypeErase; /*!< Mass erase or sector Erase. + This parameter can be a value of @ref FLASHEx_Type_Erase */ + + uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled + This parameter must be a value of @ref FLASHEx_Sectors */ + + uint32_t NbSectors; /*!< Number of sectors to be erased. + This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ + + uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism + This parameter must be a value of @ref FLASHEx_Voltage_Range */ + +} FLASH_EraseInitTypeDef; + +/** + * @brief FLASH Option Bytes Program structure definition + */ +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured. + This parameter can be a value of @ref FLASHEx_Option_Type */ + + uint32_t WRPState; /*!< Write protection activation or deactivation. + This parameter can be a value of @ref FLASHEx_WRP_State */ + + uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. + The value of this parameter depend on device used within the same series */ + + uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t RDPLevel; /*!< Set the read protection level. + This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ + + uint32_t BORLevel; /*!< Set the BOR Level. + This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ + + uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ + +} FLASH_OBProgramInitTypeDef; + +/** + * @brief FLASH Advanced Option Bytes Program structure definition + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured for extension. + This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ + + uint32_t PCROPState; /*!< PCROP activation or deactivation. + This parameter can be a value of @ref FLASHEx_PCROP_State */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ + STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint8_t BootConfig; /*!< Specifies Option bytes for boot config. + This parameter can be a value of @ref FLASHEx_Dual_Boot */ + +#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +}FLASH_AdvOBProgramInitTypeDef; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || + STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASHEx_Type_Erase FLASH Type Erase + * @{ + */ +#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ +#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ +/** + * @} + */ + +/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range + * @{ + */ +#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ +#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ +#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ +#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ +/** + * @} + */ + +/** @defgroup FLASHEx_WRP_State FLASH WRP State + * @{ + */ +#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ +#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Type FLASH Option Type + * @{ + */ +#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ +#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ +#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ +#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection + * @{ + */ +#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) +#define OB_RDP_LEVEL_1 ((uint8_t)0x55) +#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 + it s no more possible to go back to level 1 or 0 */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog + * @{ + */ +#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP + * @{ + */ +#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ +/** + * @} + */ + + +/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY + * @{ + */ +#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ +/** + * @} + */ + +/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level + * @{ + */ +#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ +#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ +#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ +#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup FLASHEx_PCROP_State FLASH PCROP State + * @{ + */ +#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ +#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ +#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ + (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) + +#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Functions FLASH Private Functions + * @{ + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); +void FLASH_FlushCaches(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h index fd86bf68..9fab0c98 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h @@ -1,79 +1,79 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.h - * @author MCD Application Team - * @brief Header file of FLASH RAMFUNC driver. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_RAMFUNC_H -#define __STM32F4xx_FLASH_RAMFUNC_H - -#ifdef __cplusplus - extern "C" { -#endif -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_RAMFUNC_Exported_Functions - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 - * @{ - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.h + * @author MCD Application Team + * @brief Header file of FLASH RAMFUNC driver. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_FLASH_RAMFUNC_H +#define __STM32F4xx_FLASH_RAMFUNC_H + +#ifdef __cplusplus + extern "C" { +#endif +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_RAMFUNC_Exported_Functions + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 + * @{ + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h index 34d393ab..5a175384 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h @@ -1,309 +1,309 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_H -#define __STM32F4xx_HAL_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode_define */ - - uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull_define */ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_speed_define */ - - uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_Alternate_function_selection */ -}GPIO_InitTypeDef; - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - GPIO_PIN_RESET = 0, - GPIO_PIN_SET -}GPIO_PinState; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins_define GPIO pins define - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ -/** - * @} - */ - -/** @defgroup GPIO_mode_define GPIO mode define - * @brief GPIO Configuration Mode - * Elements values convention: 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_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 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ -/** - * @} - */ - - /** @defgroup GPIO_pull_define GPIO pull define - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ -#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param __EXTI_LINE__ specifies the EXTI line flag to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending flags. - * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending bits. - * @param __EXTI_LINE__ specifies the EXTI lines to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) -/** - * @} - */ - -/* Include GPIO HAL Extension module */ -#include "stm32f4xx_hal_gpio_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup GPIO_Exported_Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); -/** - * @} - */ - -/** @addtogroup GPIO_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ -#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ - ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ - ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ - ((MODE) == GPIO_MODE_AF_PP) ||\ - ((MODE) == GPIO_MODE_AF_OD) ||\ - ((MODE) == GPIO_MODE_IT_RISING) ||\ - ((MODE) == GPIO_MODE_IT_FALLING) ||\ - ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING) ||\ - ((MODE) == GPIO_MODE_EVT_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_ANALOG)) -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ - ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) -#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ - ((PULL) == GPIO_PULLDOWN)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_H +#define __STM32F4xx_HAL_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Types GPIO Exported Types + * @{ + */ + +/** + * @brief GPIO Init structure definition + */ +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode_define */ + + uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. + This parameter can be a value of @ref GPIO_pull_define */ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_speed_define */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_Alternate_function_selection */ +}GPIO_InitTypeDef; + +/** + * @brief GPIO Bit SET and Bit RESET enumeration + */ +typedef enum +{ + GPIO_PIN_RESET = 0, + GPIO_PIN_SET +}GPIO_PinState; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup GPIO_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_pins_define GPIO pins define + * @{ + */ +#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ + +#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ +/** + * @} + */ + +/** @defgroup GPIO_mode_define GPIO mode define + * @brief GPIO Configuration Mode + * Elements values convention: 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_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 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ +/** + * @} + */ + + /** @defgroup GPIO_pull_define GPIO pull define + * @brief GPIO Pull-Up or Pull-Down Activation + * @{ + */ +#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ +#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ +#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Macros GPIO Exported Macros + * @{ + */ + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param __EXTI_LINE__ specifies the EXTI line flag to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending flags. + * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending bits. + * @param __EXTI_LINE__ specifies the EXTI lines to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Generates a Software interrupt on selected EXTI line. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) +/** + * @} + */ + +/* Include GPIO HAL Extension module */ +#include "stm32f4xx_hal_gpio_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_Exported_Functions + * @{ + */ + +/** @addtogroup GPIO_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); +/** + * @} + */ + +/** @addtogroup GPIO_Exported_Functions_Group2 + * @{ + */ +/* IO operation functions *****************************************************/ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIO_Private_Macros GPIO Private Macros + * @{ + */ +#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) +#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ + ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ + ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ + ((MODE) == GPIO_MODE_AF_PP) ||\ + ((MODE) == GPIO_MODE_AF_OD) ||\ + ((MODE) == GPIO_MODE_IT_RISING) ||\ + ((MODE) == GPIO_MODE_IT_FALLING) ||\ + ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING) ||\ + ((MODE) == GPIO_MODE_EVT_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_ANALOG)) +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ + ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) +#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ + ((PULL) == GPIO_PULLDOWN)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h index 4e421082..aa1e34d8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h @@ -1,1592 +1,1592 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio_ex.h - * @author MCD Application Team - * @brief Header file of GPIO HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_EX_H -#define __STM32F4xx_HAL_GPIO_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIOEx GPIOEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection - * @{ - */ - -/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -/** @brief GPIO_Legacy - */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F413xx || STM32F423xx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F411xE */ - -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F446xx -----------------------*/ -#if defined(STM32F446xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros - * @{ - */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions - * @{ - */ -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Constants GPIO Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Macros GPIO Private Macros - * @{ - */ -/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U : 8U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U :\ - ((__GPIOx__) == (GPIOI))? 8U :\ - ((__GPIOx__) == (GPIOJ))? 9U : 10U) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U : 7U) -#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F412Vx */ -#if defined(STM32F412Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U : 7U) -#endif /* STM32F412Rx */ -#if defined(STM32F412Cx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F412Cx */ - -/** - * @} - */ - -/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function - * @{ - */ -/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC)) - -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) - -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------- STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ - ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ - ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ - ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ - ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ - ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio_ex.h + * @author MCD Application Team + * @brief Header file of GPIO HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_EX_H +#define __STM32F4xx_HAL_GPIO_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection + * @{ + */ + +/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +/** @brief GPIO_Legacy + */ +#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ +#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ +#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ +#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ +#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F413xx || STM32F423xx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F411xE */ + +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F446xx -----------------------*/ +#if defined(STM32F446xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ +#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ +#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros + * @{ + */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions + * @{ + */ +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Constants GPIO Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Macros GPIO Private Macros + * @{ + */ +/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U : 8U) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U :\ + ((__GPIOx__) == (GPIOI))? 8U :\ + ((__GPIOx__) == (GPIOJ))? 9U : 10U) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U : 7U) +#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F412Vx */ +#if defined(STM32F412Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U : 7U) +#endif /* STM32F412Rx */ +#if defined(STM32F412Cx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F412Cx */ + +/** + * @} + */ + +/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function + * @{ + */ +/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC)) + +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) + +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ + ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ + ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ + ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ + ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------- STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ + ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ + ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ + ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ + ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ + ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h index 7ee95b70..6f3bf714 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h @@ -1,431 +1,431 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.h - * @author MCD Application Team - * @brief Header file of PWR HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_H -#define __STM32F4xx_HAL_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Types PWR Exported Types - * @{ - */ - -/** - * @brief PWR PVD configuration structure definition - */ -typedef struct -{ - uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. - This parameter can be a value of @ref PWR_PVD_detection_level */ - - uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. - This parameter can be a value of @ref PWR_PVD_Mode */ -}PWR_PVDTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN1 0x00000100U -/** - * @} - */ - -/** @defgroup PWR_PVD_detection_level PWR PVD detection level - * @{ - */ -#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage - (Compare internally to VREFINT) */ -/** - * @} - */ - -/** @defgroup PWR_PVD_Mode PWR PVD Mode - * @{ - */ -#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode - * @{ - */ -#define PWR_MAINREGULATOR_ON 0x00000000U -#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry - * @{ - */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) -/** - * @} - */ - -/** @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 -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_Exported_Macro PWR Exported Macro - * @{ - */ - -/** @brief Check PWR flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the PWR's pending flags. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - */ -#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) - -/** - * @brief Enable the PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable the PVD EXTI Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Disable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Enable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief Disable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief PVD EXTI line configuration: set rising & falling edge trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. - * This parameter can be: - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief checks whether the specified PVD Exti interrupt flag is set or not. - * @retval EXTI PVD Line Status. - */ -#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) - -/** - * @brief Clear the PVD Exti flag. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) - -/** - * @brief Generates a Software interrupt on PVD EXTI line. - * @retval None - */ -#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) - -/** - * @} - */ - -/* Include PWR HAL Extension module */ -#include "stm32f4xx_hal_pwr_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_PWR_DeInit(void); -void HAL_PWR_EnableBkUpAccess(void); -void HAL_PWR_DisableBkUpAccess(void); -/** - * @} - */ - -/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -/* Peripheral Control functions **********************************************/ -/* PVD configuration */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); -void HAL_PWR_EnablePVD(void); -void HAL_PWR_DisablePVD(void); - -/* WakeUp pins configuration */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); - -/* Low Power modes entry */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); -void HAL_PWR_EnterSTANDBYMode(void); - -/* Power PVD IRQ Handler */ -void HAL_PWR_PVD_IRQHandler(void); -void HAL_PWR_PVDCallback(void); - -/* Cortex System Control functions *******************************************/ -void HAL_PWR_EnableSleepOnExit(void); -void HAL_PWR_DisableSleepOnExit(void); -void HAL_PWR_EnableSEVOnPend(void); -void HAL_PWR_DisableSEVOnPend(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line - * @{ - */ -#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ -/** - * @} - */ - -/** @defgroup PWR_register_alias_address PWR Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) -#define PWR_CR_OFFSET 0x00U -#define PWR_CSR_OFFSET 0x04U -#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) -#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) -/** - * @} - */ - -/** @defgroup PWR_CR_register_alias PWR CR Register alias address - * @{ - */ -/* --- CR Register ---*/ -/* Alias word address of DBP bit */ -#define DBP_BIT_NUMBER PWR_CR_DBP_Pos -#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) - -/* Alias word address of PVDE bit */ -#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos -#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) - -/* Alias word address of VOS bit */ -#define VOS_BIT_NUMBER PWR_CR_VOS_Pos -#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of EWUP bit */ -#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos -#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters - * @{ - */ -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ - ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ - ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ - ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) -#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ - ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ - ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ - ((MODE) == PWR_PVD_MODE_NORMAL)) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_H +#define __STM32F4xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Types PWR Exported Types + * @{ + */ + +/** + * @brief PWR PVD configuration structure definition + */ +typedef struct +{ + uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. + This parameter can be a value of @ref PWR_PVD_detection_level */ + + uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. + This parameter can be a value of @ref PWR_PVD_Mode */ +}PWR_PVDTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN1 0x00000100U +/** + * @} + */ + +/** @defgroup PWR_PVD_detection_level PWR PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 +#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 +#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 +#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 +#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 +#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 +#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 +#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage + (Compare internally to VREFINT) */ +/** + * @} + */ + +/** @defgroup PWR_PVD_Mode PWR PVD Mode + * @{ + */ +#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ +#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ +/** + * @} + */ + + +/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode + * @{ + */ +#define PWR_MAINREGULATOR_ON 0x00000000U +#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry + * @{ + */ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) +/** + * @} + */ + +/** @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 +#define PWR_FLAG_BRR PWR_CSR_BRR +#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_Exported_Macro PWR Exported Macro + * @{ + */ + +/** @brief Check PWR flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event + * was received from the WKUP pin or from the RTC alarm (Alarm A + * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. + * An additional wakeup event is detected if the WKUP pin is enabled + * (by setting the EWUP bit) when the WKUP pin level is already high. + * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was + * resumed from StandBy mode. + * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled + * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode + * For this reason, this bit is equal to 0 after Standby or reset + * until the PVDE bit is set. + * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset + * when the device wakes up from Standby mode or by a system reset + * or power reset. + * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage + * scaling output selection is ready. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the PWR's pending flags. + * @param __FLAG__ specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + */ +#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) + +/** + * @brief Enable the PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable the PVD EXTI Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Disable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Enable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief Disable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief PVD EXTI line configuration: set rising & falling edge trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. + * This parameter can be: + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief checks whether the specified PVD Exti interrupt flag is set or not. + * @retval EXTI PVD Line Status. + */ +#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) + +/** + * @brief Clear the PVD Exti flag. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) + +/** + * @brief Generates a Software interrupt on PVD EXTI line. + * @retval None + */ +#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) + +/** + * @} + */ + +/* Include PWR HAL Extension module */ +#include "stm32f4xx_hal_pwr_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_PWR_DeInit(void); +void HAL_PWR_EnableBkUpAccess(void); +void HAL_PWR_DisableBkUpAccess(void); +/** + * @} + */ + +/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @{ + */ +/* Peripheral Control functions **********************************************/ +/* PVD configuration */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); +void HAL_PWR_EnablePVD(void); +void HAL_PWR_DisablePVD(void); + +/* WakeUp pins configuration */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); + +/* Low Power modes entry */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); +void HAL_PWR_EnterSTANDBYMode(void); + +/* Power PVD IRQ Handler */ +void HAL_PWR_PVD_IRQHandler(void); +void HAL_PWR_PVDCallback(void); + +/* Cortex System Control functions *******************************************/ +void HAL_PWR_EnableSleepOnExit(void); +void HAL_PWR_DisableSleepOnExit(void); +void HAL_PWR_EnableSEVOnPend(void); +void HAL_PWR_DisableSEVOnPend(void); +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWR_Private_Constants PWR Private Constants + * @{ + */ + +/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line + * @{ + */ +#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ +/** + * @} + */ + +/** @defgroup PWR_register_alias_address PWR Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) +#define PWR_CR_OFFSET 0x00U +#define PWR_CSR_OFFSET 0x04U +#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) +#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) +/** + * @} + */ + +/** @defgroup PWR_CR_register_alias PWR CR Register alias address + * @{ + */ +/* --- CR Register ---*/ +/* Alias word address of DBP bit */ +#define DBP_BIT_NUMBER PWR_CR_DBP_Pos +#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) + +/* Alias word address of PVDE bit */ +#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos +#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) + +/* Alias word address of VOS bit */ +#define VOS_BIT_NUMBER PWR_CR_VOS_Pos +#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of EWUP bit */ +#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos +#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWR_Private_Macros PWR Private Macros + * @{ + */ + +/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters + * @{ + */ +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ + ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ + ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ + ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) +#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ + ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ + ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ + ((MODE) == PWR_PVD_MODE_NORMAL)) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) +#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h index 9c4f9876..10e017a1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h @@ -1,344 +1,344 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.h - * @author MCD Application Team - * @brief Header file of PWR HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_EX_H -#define __STM32F4xx_HAL_PWR_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWREx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode - * @{ - */ -#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS -#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) -/** - * @} - */ - -/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag - * @{ - */ -#define PWR_FLAG_ODRDY PWR_CSR_ODRDY -#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY -#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ -#else -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to - 180 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to - 168 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ -/** - * @} - */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN2 0x00000080U -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 0x00000040U -#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#else -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to enable or disable the Over drive mode. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Over drive switching. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Under drive mode. - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - */ -#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) -#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) - -/** @brief Check PWR flag is set or not. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode - * is ready - * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode - * switching is ready - * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode - * is enabled in Stop mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the Under-Drive Ready flag. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @addtogroup PWREx_Exported_Functions_Group1 - * @{ - */ -void HAL_PWREx_EnableFlashPowerDown(void); -void HAL_PWREx_DisableFlashPowerDown(void); -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); -uint32_t HAL_PWREx_GetVoltageRange(void); -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -void HAL_PWREx_EnableMainRegulatorLowVoltage(void); -void HAL_PWREx_DisableMainRegulatorLowVoltage(void); -void HAL_PWREx_EnableLowRegulatorLowVoltage(void); -void HAL_PWREx_DisableLowRegulatorLowVoltage(void); -#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWREx_Private_Constants PWREx Private Constants - * @{ - */ - -/** @defgroup PWREx_register_alias_address PWREx Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -/* --- CR Register ---*/ -/* Alias word address of FPDS bit */ -#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos -#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) - -/* Alias word address of ODEN bit */ -#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos -#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) - -/* Alias word address of ODSWEN bit */ -#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos -#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) - -/* Alias word address of MRLVDS bit */ -#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos -#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) - -/* Alias word address of LPLVDS bit */ -#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos -#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) - - /** - * @} - */ - -/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of BRE bit */ -#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos -#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWREx_Private_Macros PWREx Private Macros - * @{ - */ - -/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) -#else -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F446xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ - ((PIN) == PWR_WAKEUP_PIN3)) -#else -#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) -#endif /* STM32F446xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.h + * @author MCD Application Team + * @brief Header file of PWR HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_EX_H +#define __STM32F4xx_HAL_PWR_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWREx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode + * @{ + */ +#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS +#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) +/** + * @} + */ + +/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag + * @{ + */ +#define PWR_FLAG_ODRDY PWR_CSR_ODRDY +#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY +#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ +#else +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to + 180 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to + 168 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ +/** + * @} + */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN2 0x00000080U +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define PWR_WAKEUP_PIN3 0x00000040U +#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#else +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to enable or disable the Over drive mode. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Over drive switching. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Under drive mode. + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode. + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + */ +#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) +#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) + +/** @brief Check PWR flag is set or not. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode + * is ready + * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode + * switching is ready + * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode + * is enabled in Stop mode + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the Under-Drive Ready flag. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @addtogroup PWREx_Exported_Functions_Group1 + * @{ + */ +void HAL_PWREx_EnableFlashPowerDown(void); +void HAL_PWREx_DisableFlashPowerDown(void); +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); +uint32_t HAL_PWREx_GetVoltageRange(void); +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +void HAL_PWREx_EnableMainRegulatorLowVoltage(void); +void HAL_PWREx_DisableMainRegulatorLowVoltage(void); +void HAL_PWREx_EnableLowRegulatorLowVoltage(void); +void HAL_PWREx_DisableLowRegulatorLowVoltage(void); +#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWREx_Private_Constants PWREx Private Constants + * @{ + */ + +/** @defgroup PWREx_register_alias_address PWREx Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +/* --- CR Register ---*/ +/* Alias word address of FPDS bit */ +#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos +#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) + +/* Alias word address of ODEN bit */ +#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos +#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) + +/* Alias word address of ODSWEN bit */ +#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos +#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) + +/* Alias word address of MRLVDS bit */ +#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos +#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) + +/* Alias word address of LPLVDS bit */ +#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos +#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) + + /** + * @} + */ + +/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of BRE bit */ +#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos +#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWREx_Private_Macros PWREx Private Macros + * @{ + */ + +/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) +#else +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F446xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ + ((PIN) == PWR_WAKEUP_PIN3)) +#else +#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) +#endif /* STM32F446xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h index 44553fba..36a639b4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h @@ -1,1464 +1,1464 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.h - * @author MCD Application Team - * @brief Header file of RCC HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_H -#define __STM32F4xx_HAL_RCC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include RCC HAL Extended module */ -/* (include on top of file since RCC structures are defined in extended file) */ -#include "stm32f4xx_hal_rcc_ex.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Types RCC Exported Types - * @{ - */ - -/** - * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition - */ -typedef struct -{ - uint32_t OscillatorType; /*!< The oscillators to be configured. - This parameter can be a value of @ref RCC_Oscillator_Type */ - - uint32_t HSEState; /*!< The new state of the HSE. - This parameter can be a value of @ref RCC_HSE_Config */ - - uint32_t LSEState; /*!< The new state of the LSE. - This parameter can be a value of @ref RCC_LSE_Config */ - - uint32_t HSIState; /*!< The new state of the HSI. - This parameter can be a value of @ref RCC_HSI_Config */ - - uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ - - uint32_t LSIState; /*!< The new state of the LSI. - This parameter can be a value of @ref RCC_LSI_Config */ - - RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ -}RCC_OscInitTypeDef; - -/** - * @brief RCC System, AHB and APB busses clock configuration structure definition - */ -typedef struct -{ - uint32_t ClockType; /*!< The clock to be configured. - This parameter can be a value of @ref RCC_System_Clock_Type */ - - uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. - This parameter can be a value of @ref RCC_System_Clock_Source */ - - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_AHB_Clock_Source */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - -}RCC_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_Oscillator_Type Oscillator Type - * @{ - */ -#define RCC_OSCILLATORTYPE_NONE 0x00000000U -#define RCC_OSCILLATORTYPE_HSE 0x00000001U -#define RCC_OSCILLATORTYPE_HSI 0x00000002U -#define RCC_OSCILLATORTYPE_LSE 0x00000004U -#define RCC_OSCILLATORTYPE_LSI 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_HSE_Config HSE Config - * @{ - */ -#define RCC_HSE_OFF 0x00000000U -#define RCC_HSE_ON RCC_CR_HSEON -#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Config LSE Config - * @{ - */ -#define RCC_LSE_OFF 0x00000000U -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Config HSI Config - * @{ - */ -#define RCC_HSI_OFF ((uint8_t)0x00) -#define RCC_HSI_ON ((uint8_t)0x01) - -#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ -/** - * @} - */ - -/** @defgroup RCC_LSI_Config LSI Config - * @{ - */ -#define RCC_LSI_OFF ((uint8_t)0x00) -#define RCC_LSI_ON ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup RCC_PLL_Config PLL Config - * @{ - */ -#define RCC_PLL_NONE ((uint8_t)0x00) -#define RCC_PLL_OFF ((uint8_t)0x01) -#define RCC_PLL_ON ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider - * @{ - */ -#define RCC_PLLP_DIV2 0x00000002U -#define RCC_PLLP_DIV4 0x00000004U -#define RCC_PLLP_DIV6 0x00000006U -#define RCC_PLLP_DIV8 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source PLL Clock Source - * @{ - */ -#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI -#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Type System Clock Type - * @{ - */ -#define RCC_CLOCKTYPE_SYSCLK 0x00000001U -#define RCC_CLOCKTYPE_HCLK 0x00000002U -#define RCC_CLOCKTYPE_PCLK1 0x00000004U -#define RCC_CLOCKTYPE_PCLK2 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source System Clock Source - * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status - * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source AHB Clock Source - * @{ - */ -#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source - * @{ - */ -#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 -#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 -#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 -#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 -#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source RTC Clock Source - * @{ - */ -#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U -#define RCC_RTCCLKSOURCE_LSE 0x00000100U -#define RCC_RTCCLKSOURCE_LSI 0x00000200U -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U -#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U -#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U -#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U -#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U -#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U -#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U -#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U -#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U -#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U -#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U -#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U -#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U -#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U -#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U -#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U -#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U -#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U -#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U -#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U -/** - * @} - */ - -/** @defgroup RCC_MCO_Index MCO Index - * @{ - */ -#define RCC_MCO1 0x00000000U -#define RCC_MCO2 0x00000001U -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source - * @{ - */ -#define RCC_MCO1SOURCE_HSI 0x00000000U -#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 -#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 -#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 -/** - * @} - */ - -/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler - * @{ - */ -#define RCC_MCODIV_1 0x00000000U -#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 -#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE -/** - * @} - */ - -/** @defgroup RCC_Interrupt Interrupts - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup RCC_Flag Flags - * Elements values convention: 0XXYYYYYb - * - YYYYY : Flag position in the register - * - 0XX : Register index - * - 01: CR register - * - 10: BDCR register - * - 11: CSR register - * @{ - */ -/* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) - -/* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41) - -/* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) -#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) -#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) -#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) -#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) -#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) -#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) -#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) -#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) -#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) -#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) - -#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) -#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) -#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) -#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) -#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) -#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_PWR_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) -#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) -#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) -#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) -#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) -#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) -#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) -#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) -#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) -#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) -#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) -#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) -#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) - -#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) -#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) -#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) -#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) -#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) -#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) -#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) -#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) -#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) -#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) -#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) -#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) -#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) -#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) -#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) -#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) -#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) -#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) -#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) -#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) - -#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) -#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) -#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) -#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) -#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) -#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) -#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) - -#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) - -#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) - -#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Configuration HSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wake-up from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - */ -#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) -#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) - -/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param __HSICalibrationValue__ specifies the calibration trimming value. - * (default is RCC_HSICALIBRATION_DEFAULT). - * This parameter must be a number between 0 and 0x1F. - */ -#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ - RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) -/** - * @} - */ - -/** @defgroup RCC_LSI_Configuration LSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - */ -#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) -#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_HSE_Configuration HSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External High Speed oscillator (HSE). - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. - * User should request a transition to HSE Off first and then HSE On or HSE Bypass. - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param __STATE__ specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator. - * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_HSE_CONFIG(__STATE__) \ - do { \ - if ((__STATE__) == RCC_HSE_ON) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else if ((__STATE__) == RCC_HSE_BYPASS) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration LSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External Low Speed oscillator (LSE). - * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. - * User should request a transition to LSE Off first and then LSE On or LSE Bypass. - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * HAL_PWR_EnableBkUpAccess() function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param __STATE__ specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator. - * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_LSE_CONFIG(__STATE__) \ - do { \ - if((__STATE__) == RCC_LSE_ON) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else if((__STATE__) == RCC_LSE_BYPASS) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration - * @{ - */ - -/** @brief Macros to enable or disable the RTC clock. - * @note These macros must be used only after the RTC clock source was selected. - */ -#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) -#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) - -/** @brief Macros to configure the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using the Power Backup Access macro before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by - * a Power On Reset (POR). - * @param __RTCCLKSource__ specifies the RTC clock source. - * This parameter can be one of the following values: - @arg @ref RCC_RTCCLKSOURCE_NO_CLK: No clock selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSE: LSE selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSI: LSI selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected - * as RTC clock, where x:[2,31] - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wake-up source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - */ -#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) - -#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ - RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while(0U) - -/** @brief Macro to get the RTC clock source. - * @retval The clock source can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) - -/** - * @brief Get the RTC and HSE clock divider (RTCPRE). - * @retval Returned value can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected - * as RTC clock, where x:[2,31] - */ -#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) - -/** @brief Macros to force or release the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - */ -#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) -#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_PLL_Configuration PLL Configuration - * @{ - */ - -/** @brief Macros to enable or disable the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) -#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) - -/** @brief Macro to configure the PLL clock source. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLSOURCE__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * - */ -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) - -/** @brief Macro to configure the PLL multiplication factor. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - */ -#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) -/** - * @} - */ - -/** @defgroup RCC_Get_Clock_source Get Clock source - * @{ - */ -/** - * @brief Macro to configure the system clock source. - * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. - * This parameter can be one of the following values: - * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This - * parameter is available only for STM32F446xx devices. - */ -#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) - -/** @brief Macro to get the clock source used as system clock. - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter - * is available only for STM32F446xx devices. - */ -#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) - -/** @brief Macro to get the oscillator used as PLL clock source. - * @retval The oscillator used as PLL clock source. The returned value can be one - * of the following: - * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. - * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. - */ -#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) -/** - * @} - */ - -/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config - * @{ - */ - -/** @brief Macro to configure the MCO1 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - */ -#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) - -/** @brief Macro to configure the MCO2 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have - * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - */ -#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); -/** - * @} - */ - -/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management - * @brief macros to manage the specified RCC Flags and interrupts. - * @{ - */ - -/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) - -/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) - -/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] - * bits to clear the selected interrupt pending bits. - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - */ -#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) - -/** @brief Check the RCC's interrupt has occurred or not. - * @param __INTERRUPT__ specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, - * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. - */ -#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) - -/** @brief Check RCC flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. - * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. - * @arg RCC_FLAG_PINRST: Pin reset. - * @arg RCC_FLAG_PORRST: POR/PDR reset. - * @arg RCC_FLAG_SFTRST: Software reset. - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. - * @arg RCC_FLAG_LPWRRST: Low Power reset. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - /** @addtogroup RCC_Exported_Functions - * @{ - */ - -/** @addtogroup RCC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions ******************************/ -HAL_StatusTypeDef HAL_RCC_DeInit(void); -HAL_StatusTypeDef HAL_RCC_OscConfig(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); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Constants RCC Private Constants - * @{ - */ - -/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register --- */ -/* Alias word address of HSION bit */ -#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) -#define RCC_HSION_BIT_NUMBER 0x00U -#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) -/* Alias word address of CSSON bit */ -#define RCC_CSSON_BIT_NUMBER 0x13U -#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) -/* Alias word address of PLLON bit */ -#define RCC_PLLON_BIT_NUMBER 0x18U -#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) - -/* --- BDCR Register --- */ -/* Alias word address of RTCEN bit */ -#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) -#define RCC_RTCEN_BIT_NUMBER 0x0FU -#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) -/* Alias word address of BDRST bit */ -#define RCC_BDRST_BIT_NUMBER 0x10U -#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) - -/* --- CSR Register --- */ -/* Alias word address of LSION bit */ -#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) -#define RCC_LSION_BIT_NUMBER 0x00U -#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS 0x40023802U - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) - -/* BDCR register base address */ -#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) - -#define RCC_DBP_TIMEOUT_VALUE 2U -#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT - -#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCC_Private_Macros RCC Private Macros - * @{ - */ - -/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) - -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_BYPASS)) - -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_BYPASS)) - -#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) - -#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) - -#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) - -#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ - ((SOURCE) == RCC_PLLSOURCE_HSE)) - -#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) - -#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) - -#define IS_RCC_PLLM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) - -#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ - ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ - ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ - ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ - ((HCLK) == RCC_SYSCLK_DIV512)) - -#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) - -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ - ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ - ((PCLK) == RCC_HCLK_DIV16)) - -#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) - -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ - ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) - -#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ - ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ - ((DIV) == RCC_MCODIV_5)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_H +#define __STM32F4xx_HAL_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/* Include RCC HAL Extended module */ +/* (include on top of file since RCC structures are defined in extended file) */ +#include "stm32f4xx_hal_rcc_ex.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition + */ +typedef struct +{ + uint32_t OscillatorType; /*!< The oscillators to be configured. + This parameter can be a value of @ref RCC_Oscillator_Type */ + + uint32_t HSEState; /*!< The new state of the HSE. + This parameter can be a value of @ref RCC_HSE_Config */ + + uint32_t LSEState; /*!< The new state of the LSE. + This parameter can be a value of @ref RCC_LSE_Config */ + + uint32_t HSIState; /*!< The new state of the HSI. + This parameter can be a value of @ref RCC_HSI_Config */ + + uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ + + uint32_t LSIState; /*!< The new state of the LSI. + This parameter can be a value of @ref RCC_LSI_Config */ + + RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ +}RCC_OscInitTypeDef; + +/** + * @brief RCC System, AHB and APB busses clock configuration structure definition + */ +typedef struct +{ + uint32_t ClockType; /*!< The clock to be configured. + This parameter can be a value of @ref RCC_System_Clock_Type */ + + uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. + This parameter can be a value of @ref RCC_System_Clock_Source */ + + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_AHB_Clock_Source */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + +}RCC_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_Oscillator_Type Oscillator Type + * @{ + */ +#define RCC_OSCILLATORTYPE_NONE 0x00000000U +#define RCC_OSCILLATORTYPE_HSE 0x00000001U +#define RCC_OSCILLATORTYPE_HSI 0x00000002U +#define RCC_OSCILLATORTYPE_LSE 0x00000004U +#define RCC_OSCILLATORTYPE_LSI 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_HSE_Config HSE Config + * @{ + */ +#define RCC_HSE_OFF 0x00000000U +#define RCC_HSE_ON RCC_CR_HSEON +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF 0x00000000U +#define RCC_LSE_ON RCC_BDCR_LSEON +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF ((uint8_t)0x00) +#define RCC_HSI_ON ((uint8_t)0x01) + +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF ((uint8_t)0x00) +#define RCC_LSI_ON ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE ((uint8_t)0x00) +#define RCC_PLL_OFF ((uint8_t)0x01) +#define RCC_PLL_ON ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider + * @{ + */ +#define RCC_PLLP_DIV2 0x00000002U +#define RCC_PLLP_DIV4 0x00000004U +#define RCC_PLLP_DIV6 0x00000006U +#define RCC_PLLP_DIV8 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_PLL_Clock_Source PLL Clock Source + * @{ + */ +#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI +#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U +#define RCC_CLOCKTYPE_HCLK 0x00000002U +#define RCC_CLOCKTYPE_PCLK1 0x00000004U +#define RCC_CLOCKTYPE_PCLK2 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL +#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U +#define RCC_RTCCLKSOURCE_LSE 0x00000100U +#define RCC_RTCCLKSOURCE_LSI 0x00000200U +#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U +#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U +#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U +#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U +#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U +#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U +#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U +#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U +#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U +#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U +#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U +#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U +#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U +#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U +#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U +#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U +#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U +#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U +#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U +#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U +#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U +/** + * @} + */ + +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 0x00000000U +#define RCC_MCO2 0x00000001U +/** + * @} + */ + +/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_HSI 0x00000000U +#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 +#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 +#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 +/** + * @} + */ + +/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler + * @{ + */ +#define RCC_MCODIV_1 0x00000000U +#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 +#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) +#define RCC_IT_CSS ((uint8_t)0x80) +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: 0XXYYYYYb + * - YYYYY : Flag position in the register + * - 0XX : Register index + * - 01: CR register + * - 10: BDCR register + * - 11: CSR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)0x41) + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_BORRST ((uint8_t)0x79) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) +#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) +#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) + +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) +#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) +#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) + +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) +#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) +#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) +#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) +#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) +#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) +#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) + +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) +#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) +#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) +#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) + +#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) + +#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) + +#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Configuration HSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). + * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. + * It is used (enabled by hardware) as system clock source after startup + * from Reset, wake-up from STOP and STANDBY mode, or in case of failure + * of the HSE used directly or indirectly as system clock (if the Clock + * Security System CSS is enabled). + * @note HSI can not be stopped if it is used as system clock source. In this case, + * you have to select another source of the system clock then stop the HSI. + * @note After enabling the HSI, the application software should wait on HSIRDY + * flag to be set indicating that HSI clock is stable and can be used as + * system clock source. + * This parameter can be: ENABLE or DISABLE. + * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator + * clock cycles. + */ +#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) +#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) + +/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. + * @note The calibration is used to compensate for the variations in voltage + * and temperature that influence the frequency of the internal HSI RC. + * @param __HSICalibrationValue__ specifies the calibration trimming value. + * (default is RCC_HSICALIBRATION_DEFAULT). + * This parameter must be a number between 0 and 0x1F. + */ +#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ + RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) +/** + * @} + */ + +/** @defgroup RCC_LSI_Configuration LSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). + * @note After enabling the LSI, the application software should wait on + * LSIRDY flag to be set indicating that LSI clock is stable and can + * be used to clock the IWDG and/or the RTC. + * @note LSI can not be disabled if the IWDG is running. + * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator + * clock cycles. + */ +#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) +#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_HSE_Configuration HSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External High Speed oscillator (HSE). + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. + * User should request a transition to HSE Off first and then HSE On or HSE Bypass. + * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application + * software should wait on HSERDY flag to be set indicating that HSE clock + * is stable and can be used to clock the PLL and/or system clock. + * @note HSE state can not be changed if it is used directly or through the + * PLL as system clock. In this case, you have to select another source + * of the system clock then change the HSE state (ex. disable it). + * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. + * @note This function reset the CSSON bit, so if the clock security system(CSS) + * was previously enabled you have to enable it again after calling this + * function. + * @param __STATE__ specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg RCC_HSE_ON: turn ON the HSE oscillator. + * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_HSE_CONFIG(__STATE__) \ + do { \ + if ((__STATE__) == RCC_HSE_ON) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else if ((__STATE__) == RCC_HSE_BYPASS) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_LSE_Configuration LSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External Low Speed oscillator (LSE). + * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. + * User should request a transition to LSE Off first and then LSE On or LSE Bypass. + * @note As the LSE is in the Backup domain and write access is denied to + * this domain after reset, you have to enable write access using + * HAL_PWR_EnableBkUpAccess() function before to configure the LSE + * (to be done once after reset). + * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application + * software should wait on LSERDY flag to be set indicating that LSE clock + * is stable and can be used to clock the RTC. + * @param __STATE__ specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg RCC_LSE_ON: turn ON the LSE oscillator. + * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_LSE_CONFIG(__STATE__) \ + do { \ + if((__STATE__) == RCC_LSE_ON) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else if((__STATE__) == RCC_LSE_BYPASS) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration + * @{ + */ + +/** @brief Macros to enable or disable the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) +#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) + +/** @brief Macros to configure the RTC clock (RTCCLK). + * @note As the RTC clock configuration bits are in the Backup domain and write + * access is denied to this domain after reset, you have to enable write + * access using the Power Backup Access macro before to configure + * the RTC clock source (to be done once after reset). + * @note Once the RTC clock is configured it can't be changed unless the + * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by + * a Power On Reset (POR). + * @param __RTCCLKSource__ specifies the RTC clock source. + * This parameter can be one of the following values: + @arg @ref RCC_RTCCLKSOURCE_NO_CLK: No clock selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSE: LSE selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSI: LSI selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected + * as RTC clock, where x:[2,31] + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wake-up source. + * However, when the HSE clock is used as RTC clock source, the RTC + * cannot be used in STOP and STANDBY modes. + * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as + * RTC clock source). + */ +#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) + +#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ + RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ + } while(0U) + +/** @brief Macro to get the RTC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** + * @brief Get the RTC and HSE clock divider (RTCPRE). + * @retval Returned value can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected + * as RTC clock, where x:[2,31] + */ +#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) + +/** @brief Macros to force or release the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_CSR register. + * @note The BKPSRAM is not affected by this reset. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macros to enable or disable the main PLL. + * @note After enabling the main PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The main PLL can not be disabled if it is used as system clock source + * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + +/** @brief Macro to configure the PLL clock source. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLSOURCE__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * + */ +#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) + +/** @brief Macro to configure the PLL multiplication factor. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * + */ +#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ +/** + * @brief Macro to configure the system clock source. + * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This + * parameter is available only for STM32F446xx devices. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) + +/** @brief Macro to get the clock source used as system clock. + * @retval The clock source used as system clock. The returned value can be one + * of the following: + * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter + * is available only for STM32F446xx devices. + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) + +/** @brief Macro to get the oscillator used as PLL clock source. + * @retval The oscillator used as PLL clock source. The returned value can be one + * of the following: + * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. + * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +/** @brief Macro to configure the MCO1 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + */ +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) + +/** @brief Macro to configure the MCO2 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have + * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + */ +#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] + * bits to clear the selected interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + */ +#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) + +/** @brief Check the RCC's interrupt has occurred or not. + * @param __INTERRUPT__ specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, + * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) + +/** @brief Check RCC flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. + * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. + * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. + * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. + * @arg RCC_FLAG_PINRST: Pin reset. + * @arg RCC_FLAG_PORRST: POR/PDR reset. + * @arg RCC_FLAG_SFTRST: Software reset. + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. + * @arg RCC_FLAG_LPWRRST: Low Power reset. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define RCC_FLAG_MASK ((uint8_t)0x1FU) +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + /** @addtogroup RCC_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions ******************************/ +HAL_StatusTypeDef HAL_RCC_DeInit(void); +HAL_StatusTypeDef HAL_RCC_OscConfig(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); + +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ + +/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) +/* --- CR Register --- */ +/* Alias word address of HSION bit */ +#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) +#define RCC_HSION_BIT_NUMBER 0x00U +#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) +/* Alias word address of CSSON bit */ +#define RCC_CSSON_BIT_NUMBER 0x13U +#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) +/* Alias word address of PLLON bit */ +#define RCC_PLLON_BIT_NUMBER 0x18U +#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) + +/* --- BDCR Register --- */ +/* Alias word address of RTCEN bit */ +#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) +#define RCC_RTCEN_BIT_NUMBER 0x0FU +#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) +/* Alias word address of BDRST bit */ +#define RCC_BDRST_BIT_NUMBER 0x10U +#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) + +/* --- CSR Register --- */ +/* Alias word address of LSION bit */ +#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) +#define RCC_LSION_BIT_NUMBER 0x00U +#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) + +/* CR register byte 3 (Bits[23:16]) base address */ +#define RCC_CR_BYTE2_ADDRESS 0x40023802U + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) + +/* BDCR register base address */ +#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) + +#define RCC_DBP_TIMEOUT_VALUE 2U +#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT + +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ + +/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) + +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_BYPASS)) + +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_BYPASS)) + +#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) + +#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) + +#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) + +#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ + ((SOURCE) == RCC_PLLSOURCE_HSE)) + +#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) + +#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) + +#define IS_RCC_PLLM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) + +#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ + ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ + ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ + ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ + ((HCLK) == RCC_SYSCLK_DIV512)) + +#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) + +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ + ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ + ((PCLK) == RCC_HCLK_DIV16)) + +#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) + +#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) + +#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ + ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ + ((DIV) == RCC_MCODIV_5)) +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h index 1412b9fc..0b8152b1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h @@ -1,7138 +1,7138 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.h - * @author MCD Application Team - * @brief Header file of RCC HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_EX_H -#define __STM32F4xx_HAL_RCC_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Types RCCEx Exported Types - * @{ - */ - -/** - * @brief RCC PLL configuration structure definition - */ -typedef struct -{ - uint32_t PLLState; /*!< The new state of the PLL. - This parameter can be a value of @ref RCC_PLL_Config */ - - uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. - This parameter must be a value of @ref RCC_PLL_Clock_Source */ - - uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ - - uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - except for STM32F411xE devices where the Min_Data = 192 */ - - uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). - This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ - - uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx - and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -}RCC_PLLInitTypeDef; - -#if defined(STM32F446xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. - This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIM; /*!< Spcifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ -}RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ - - uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. - This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. - This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F446xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLL is selected as Clock Source SAI */ - - uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ - - uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ - - uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ - - uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. - This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. - This parameter is only available in STM32F469xx/STM32F479xx devices. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ -#endif /* STM32F469xx || STM32F479xx */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ - - uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ - -}RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. - This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ -#endif /* STM32F469xx || STM32F479xx */ -}RCC_PeriphCLKInitTypeDef; - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ -#if defined(STM32F411xE) - uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ -#endif /* STM32F411xE */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - Except for STM32F411xE devices where the Min_Data = 192. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - -}RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants - * @{ - */ - -/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection - * @{ - */ -/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_TIM 0x00000004U -#define RCC_PERIPHCLK_RTC 0x00000008U -#define RCC_PERIPHCLK_FMPI2C1 0x00000010U -#define RCC_PERIPHCLK_CLK48 0x00000020U -#define RCC_PERIPHCLK_SDIO 0x00000040U -#define RCC_PERIPHCLK_PLLI2S 0x00000080U -#define RCC_PERIPHCLK_DFSDM1 0x00000100U -#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U -#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 0x00000400U -#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U -#define RCC_PERIPHCLK_LPTIM1 0x00001000U -#define RCC_PERIPHCLK_SAIA 0x00002000U -#define RCC_PERIPHCLK_SAIB 0x00004000U -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_TIM 0x00000002U -#define RCC_PERIPHCLK_RTC 0x00000004U -#define RCC_PERIPHCLK_FMPI2C1 0x00000008U -#define RCC_PERIPHCLK_LPTIM1 0x00000010U -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_SAI1 0x00000004U -#define RCC_PERIPHCLK_SAI2 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_CEC 0x00000040U -#define RCC_PERIPHCLK_FMPI2C1 0x00000080U -#define RCC_PERIPHCLK_CLK48 0x00000100U -#define RCC_PERIPHCLK_SDIO 0x00000200U -#define RCC_PERIPHCLK_SPDIFRX 0x00000400U -#define RCC_PERIPHCLK_PLLI2S 0x00000800U -#endif /* STM32F446xx */ -/*-----------------------------------------------------------------------------*/ - -/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#define RCC_PERIPHCLK_CLK48 0x00000080U -#define RCC_PERIPHCLK_SDIO 0x00000100U -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_RTC 0x00000002U -#define RCC_PERIPHCLK_PLLI2S 0x00000004U -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM 0x00000008U -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source - * @{ - */ -#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SCLKSOURCE_EXT 0x00000001U -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 0x00000000U -#define RCC_PLLSAIDIVR_4 0x00010000U -#define RCC_PLLSAIDIVR_8 0x00020000U -#define RCC_PLLSAIDIVR_16 0x00030000U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 0x00000002U -#define RCC_PLLI2SP_DIV4 0x00000004U -#define RCC_PLLI2SP_DIV6 0x00000006U -#define RCC_PLLI2SP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 0x00000002U -#define RCC_PLLSAIP_DIV4 0x00000004U -#define RCC_PLLSAIP_DIV6 0x00000006U -#define RCC_PLLSAIP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U -#define RCC_SAIACLKSOURCE_EXT 0x00200000U -/** - * @} - */ - -/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U -#define RCC_SAIBCLKSOURCE_EXT 0x00800000U -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source - * @{ - */ -#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U -#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) -/** - * @} - */ -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source - * @{ - */ -#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) -#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) -#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source - * @{ - */ -#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) -#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) -#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source - * @{ - */ -#define RCC_CECCLKSOURCE_HSI 0x00000000U -#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source - * @{ - */ -#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) -/** - * @} - */ - -#endif /* STM32F446xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) -#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) -#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) -#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) -#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ - - -/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source - * @{ - */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source - * @{ - */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source - * @{ - */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - -/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source - * @{ - */ -#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U -#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) -#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection - * @{ - */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection - * @{ - */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros - * @{ - */ -/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) -#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) -#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) - -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) -#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) -#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) -#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) -#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ - #define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) - -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) -#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) -#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) -#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) -#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) -#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) - -#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) -#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) - -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) - -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) - /** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F415xx || STM32F417xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -/** - * @} - */ -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 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_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -/** - * @} - */ -#endif /* STM32F401xC || STM32F401xE*/ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F410xx -------------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) - -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB1) peripheral clock. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) - -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() -#define __HAL_RCC_AHB2_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) - -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) - -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -/** - * @} - */ - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F411xx -------------------------------*/ -#if defined(STM32F411xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -/** - * @} - */ -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F446xx -----------------------------*/ -#if defined(STM32F446xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CEC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) -/** - * @} - */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) -#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -#endif /* STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) -#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) -#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) -#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F423xx) -#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) -#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Cx) -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() - -#define __HAL_RCC_FSMC_FORCE_RESET() -#define __HAL_RCC_QSPI_FORCE_RESET() - -#define __HAL_RCC_FSMC_RELEASE_RESET() -#define __HAL_RCC_QSPI_RELEASE_RESET() -#endif /* STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) -#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------- PLL Configuration --------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz. - * - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ - STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ - (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ - ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) -#else -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432 - * Except for STM32F411xE devices where Min_Data = 192. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices - * where frequency is between 192 and 432 MHz. - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ - (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) - #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------PLLI2S Configuration ---------------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -/** @brief Macros to enable or disable the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) -#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx */ -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLI2SP parameter is only available with STM32F446xx Devices - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#else -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F411xE) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLLI2S jitter. - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 192 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API) - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx - * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ - ((__PLLI2SQ__) << 24U) |\ - ((__PLLI2SR__) << 28U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------ PLLSAI Configuration ------------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to Enable or Disable the PLLISAI. - * @note The PLLSAI is only available with STM32F429x/439x Devices. - * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) -#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) - -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * @note The PLLSAIM parameter is only used with STM32F446xx Devices - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLSAIP parameter is only available with STM32F446xx Devices - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ - ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLL. - * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLR) / __PLLDivR__ - */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . - * This parameter must be a number between Min_Data = 1 and Max_Data = 32. - * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. - * - * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . - * This parameter must be a number between Min_Data = 2 and Max_Data = 16. - * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- Peripheral Clock selection -----------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) -/** @brief Macro to configure the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_CFGR_I2SSRC_BB = (__SOURCE__)) - - -/** @brief Macro to get the I2S clock source (I2SCLK). - * @retval The clock source can be one of the following values: - * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin - * used as I2S clock source - */ -#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block A clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to configure SAI1BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block B clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @brief Macro to configure SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI1 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) - -/** @brief Macro to configure SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI2 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) - -/** @brief Macro to configure I2S APB1 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the CEC clock. - * @param __SOURCE__ specifies the CEC clock source. - * This parameter can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CEC clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -/** @brief Macro to configure the SPDIFRX clock. - * @param __SOURCE__ specifies the SPDIFRX clock source. - * This parameter can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SPDIFRX clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) - -/** @brief Macro to configure the DSI clock. - * @param __SOURCE__ specifies the DSI clock source. - * This parameter can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the DSI clock. - * @retval The clock source can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) - -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /** @brief Macro to configure the DFSDM1 clock. - * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. - * @retval None - */ -#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM1 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. - */ -#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM1 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) - -#if defined(STM32F413xx) || defined(STM32F423xx) - /** @brief Macro to configure the DFSDM2 clock. - * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. - * @retval None - */ -#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM2 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. - */ -#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM2 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM2 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockA clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) - -/** @brief Macro to configure SAI1 BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockB clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F413xx || STM32F423xx */ - -/** @brief Macro to configure I2S APB1 clock source selection. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @param __SOURCE__ specifies the I2S APB2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). - * @note This macro must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macro to configure I2S clock source selection. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) - -/** @brief Macro to Get I2S clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the Timers clocks prescalers - * @note This feature is only available with STM32F429x/439x Devices. - * @param __PRESC__ specifies the Timers clocks prescalers selection - * This parameter can be one of the following values: - * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1 or 2, - * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to - * division by 4 or more. - * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, - * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding - * to division by 8 or more. - */ -#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ - STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ - STM32F423xx */ - -/*----------------------------------------------------------------------------*/ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Enable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Disable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) - -/** @brief Clear the PLLSAI RDY interrupt pending bits. - */ -#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) - -/** @brief Check the PLLSAI RDY interrupt has occurred or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Check PLLSAI RDY flag is set or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macros to enable or disable the RCC MCO1 feature. - */ -#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) -#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) - -/** @brief Macros to enable or disable the RCC MCO2 feature. - */ -#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) -#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCCEx_Exported_Functions - * @{ - */ - -/** @addtogroup RCCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); - -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -void HAL_RCCEx_SelectLSEMode(uint8_t Mode); -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(RCC_PLLI2S_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Constants RCCEx Private Constants - * @{ - */ - -/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -/* --- CR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1CU -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) - -#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1AU -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- DCKCFGR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) -#define RCC_TIMPRE_BIT_NUMBER 0x18U -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ - STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- CFGR Register ---*/ -#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17U -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) -/* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8U -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) - -/* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9U -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Macros RCCEx Private Macros - * @{ - */ -/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#if defined(STM32F411xE) -#define IS_RCC_PLLN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) -#else /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || - STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410Tx || STM32F410Cx || - STM32F410Rx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Cx || STM32F412Rx || - STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) -#endif /* STM32F413xx || STM32F423xx */ - -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ - ((VALUE) == RCC_PLLSAIDIVR_4) ||\ - ((VALUE) == RCC_PLLSAIDIVR_8) ||\ - ((VALUE) == RCC_PLLSAIDIVR_16)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ - ((VALUE) == RCC_PLLI2SP_DIV4) ||\ - ((VALUE) == RCC_PLLI2SP_DIV6) ||\ - ((VALUE) == RCC_PLLI2SP_DIV8)) - -#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) - -#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - - #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_CECCLKSOURCE_LSE)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ - ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - - #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) - -#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) - -#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#endif /* STM32F413xx || STM32F423xx */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) - -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_EX_H +#define __STM32F4xx_HAL_RCC_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ + + uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + except for STM32F411xE devices where the Min_Data = 192 */ + + uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). + This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ + + uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx + and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +}RCC_PLLInitTypeDef; + +#if defined(STM32F446xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. + This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIM; /*!< Spcifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ + + uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. + This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F446xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLL is selected as Clock Source SAI */ + + uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ + + uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ + + uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ + + uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. + This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. + This parameter is only available in STM32F469xx/STM32F479xx devices. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ +#endif /* STM32F469xx || STM32F479xx */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ + + uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ + +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. + This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ +#endif /* STM32F469xx || STM32F479xx */ +}RCC_PeriphCLKInitTypeDef; + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ +#if defined(STM32F411xE) + uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ +#endif /* STM32F411xE */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + Except for STM32F411xE devices where the Min_Data = 192. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants + * @{ + */ + +/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection + * @{ + */ +/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_TIM 0x00000004U +#define RCC_PERIPHCLK_RTC 0x00000008U +#define RCC_PERIPHCLK_FMPI2C1 0x00000010U +#define RCC_PERIPHCLK_CLK48 0x00000020U +#define RCC_PERIPHCLK_SDIO 0x00000040U +#define RCC_PERIPHCLK_PLLI2S 0x00000080U +#define RCC_PERIPHCLK_DFSDM1 0x00000100U +#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U +#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_DFSDM2 0x00000400U +#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U +#define RCC_PERIPHCLK_LPTIM1 0x00001000U +#define RCC_PERIPHCLK_SAIA 0x00002000U +#define RCC_PERIPHCLK_SAIB 0x00004000U +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_TIM 0x00000002U +#define RCC_PERIPHCLK_RTC 0x00000004U +#define RCC_PERIPHCLK_FMPI2C1 0x00000008U +#define RCC_PERIPHCLK_LPTIM1 0x00000010U +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_SAI1 0x00000004U +#define RCC_PERIPHCLK_SAI2 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_CEC 0x00000040U +#define RCC_PERIPHCLK_FMPI2C1 0x00000080U +#define RCC_PERIPHCLK_CLK48 0x00000100U +#define RCC_PERIPHCLK_SDIO 0x00000200U +#define RCC_PERIPHCLK_SPDIFRX 0x00000400U +#define RCC_PERIPHCLK_PLLI2S 0x00000800U +#endif /* STM32F446xx */ +/*-----------------------------------------------------------------------------*/ + +/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#define RCC_PERIPHCLK_CLK48 0x00000080U +#define RCC_PERIPHCLK_SDIO 0x00000100U +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_RTC 0x00000002U +#define RCC_PERIPHCLK_PLLI2S 0x00000004U +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_TIM 0x00000008U +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SCLKSOURCE_EXT 0x00000001U +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ + +/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIDIVR_2 0x00000000U +#define RCC_PLLSAIDIVR_4 0x00010000U +#define RCC_PLLSAIDIVR_8 0x00020000U +#define RCC_PLLSAIDIVR_16 0x00030000U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define RCC_PLLI2SP_DIV2 0x00000002U +#define RCC_PLLI2SP_DIV4 0x00000004U +#define RCC_PLLI2SP_DIV6 0x00000006U +#define RCC_PLLI2SP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIP_DIV2 0x00000002U +#define RCC_PLLSAIP_DIV4 0x00000004U +#define RCC_PLLSAIP_DIV6 0x00000006U +#define RCC_PLLSAIP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U +#define RCC_SAIACLKSOURCE_EXT 0x00200000U +/** + * @} + */ + +/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U +#define RCC_SAIBCLKSOURCE_EXT 0x00800000U +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source + * @{ + */ +#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U +#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) +/** + * @} + */ +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source + * @{ + */ +#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) +#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) +#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source + * @{ + */ +#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) +#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) +#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source + * @{ + */ +#define RCC_CECCLKSOURCE_HSI 0x00000000U +#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source + * @{ + */ +#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U +#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) +/** + * @} + */ + +#endif /* STM32F446xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) +#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) +#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) +#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) +#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ + + +/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source + * @{ + */ +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source + * @{ + */ +#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U +#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source + * @{ + */ +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + +/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source + * @{ + */ +#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U +#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) +#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection + * @{ + */ +#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) +#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection + * @{ + */ +#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) +#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros + * @{ + */ +/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) +#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) +#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) + +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) +#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) +#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) +#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) +#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ + #define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) + +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) +#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) +#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) +#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) +#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) +#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) + +#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) +#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) + +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) + +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) + /** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F415xx || STM32F417xx */ + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +/** + * @} + */ +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 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_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +/** + * @} + */ +#endif /* STM32F401xC || STM32F401xE*/ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F410xx -------------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) + +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB1) peripheral clock. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) + +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() +#define __HAL_RCC_AHB2_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) + +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) + +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +/** + * @} + */ + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F411xx -------------------------------*/ +#if defined(STM32F411xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +/** + * @} + */ +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F446xx -----------------------------*/ +#if defined(STM32F446xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CEC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) +/** + * @} + */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) +#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +#endif /* STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) +#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) +#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) +#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#if defined(STM32F423xx) +#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) +#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Cx) +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() + +#define __HAL_RCC_FSMC_FORCE_RESET() +#define __HAL_RCC_QSPI_FORCE_RESET() + +#define __HAL_RCC_FSMC_RELEASE_RESET() +#define __HAL_RCC_QSPI_RELEASE_RESET() +#endif /* STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) +#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------- PLL Configuration --------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz. + * + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ + STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ + (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ + ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) +#else +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432 + * Except for STM32F411xE devices where Min_Data = 192. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices + * where frequency is between 192 and 432 MHz. + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ + (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) + #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------PLLI2S Configuration ---------------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/** @brief Macros to enable or disable the PLLI2S. + * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) +#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx */ +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLI2SP parameter is only available with STM32F446xx Devices + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#else +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F411xE) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLLI2S jitter. + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 192 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API) + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx + * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ + ((__PLLI2SQ__) << 24U) |\ + ((__PLLI2SR__) << 28U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------ PLLSAI Configuration ------------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to Enable or Disable the PLLISAI. + * @note The PLLSAI is only available with STM32F429x/439x Devices. + * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) +#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) + +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * @note The PLLSAIM parameter is only used with STM32F446xx Devices + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLSAIP parameter is only available with STM32F446xx Devices + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ + ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLL. + * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLR) / __PLLDivR__ + */ +#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . + * This parameter must be a number between Min_Data = 1 and Max_Data = 32. + * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. + * + * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . + * This parameter must be a number between Min_Data = 2 and Max_Data = 16. + * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- Peripheral Clock selection -----------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ + defined(STM32F479xx) +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_CFGR_I2SSRC_BB = (__SOURCE__)) + + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin + * used as I2S clock source + */ +#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block A clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to configure SAI1BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block B clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @brief Macro to configure SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI1 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) + +/** @brief Macro to configure SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI2 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) + +/** @brief Macro to configure I2S APB1 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the CEC clock. + * @param __SOURCE__ specifies the CEC clock source. + * This parameter can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CEC clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +/** @brief Macro to configure the SPDIFRX clock. + * @param __SOURCE__ specifies the SPDIFRX clock source. + * This parameter can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SPDIFRX clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) + +/** @brief Macro to configure the DSI clock. + * @param __SOURCE__ specifies the DSI clock source. + * This parameter can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the DSI clock. + * @retval The clock source can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) + +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + /** @brief Macro to configure the DFSDM1 clock. + * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. + * @retval None + */ +#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM1 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. + */ +#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM1 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) + +#if defined(STM32F413xx) || defined(STM32F423xx) + /** @brief Macro to configure the DFSDM2 clock. + * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. + * @retval None + */ +#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM2 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. + */ +#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM2 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM2 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockA clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) + +/** @brief Macro to configure SAI1 BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockB clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F413xx || STM32F423xx */ + +/** @brief Macro to configure I2S APB1 clock source selection. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @param __SOURCE__ specifies the I2S APB2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). + * @note This macro must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macro to configure I2S clock source selection. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) + +/** @brief Macro to Get I2S clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the Timers clocks prescalers + * @note This feature is only available with STM32F429x/439x Devices. + * @param __PRESC__ specifies the Timers clocks prescalers selection + * This parameter can be one of the following values: + * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1 or 2, + * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to + * division by 4 or more. + * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, + * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding + * to division by 8 or more. + */ +#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ + STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ + STM32F423xx */ + +/*----------------------------------------------------------------------------*/ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Enable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Disable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) + +/** @brief Clear the PLLSAI RDY interrupt pending bits. + */ +#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) + +/** @brief Check the PLLSAI RDY interrupt has occurred or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Check PLLSAI RDY flag is set or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macros to enable or disable the RCC MCO1 feature. + */ +#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) +#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) + +/** @brief Macros to enable or disable the RCC MCO2 feature. + */ +#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) +#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCCEx_Exported_Functions + * @{ + */ + +/** @addtogroup RCCEx_Exported_Functions_Group1 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); + +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +void HAL_RCCEx_SelectLSEMode(uint8_t Mode); +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +#if defined(RCC_PLLI2S_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ + +/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +/* --- CR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of PLLSAION bit */ +#define RCC_PLLSAION_BIT_NUMBER 0x1CU +#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) + +#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of PLLI2SON bit */ +#define RCC_PLLI2SON_BIT_NUMBER 0x1AU +#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- DCKCFGR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of TIMPRE bit */ +#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) +#define RCC_TIMPRE_BIT_NUMBER 0x18U +#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ + STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- CFGR Register ---*/ +#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of I2SSRC bit */ +#define RCC_I2SSRC_BIT_NUMBER 0x17U +#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/* --- PLLI2SCFGR Register ---*/ +#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) +/* Alias word address of PLLI2SSRC bit */ +#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U +#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/* Alias word address of MCO1EN bit */ +#define RCC_MCO1EN_BIT_NUMBER 0x8U +#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) + +/* Alias word address of MCO2EN bit */ +#define RCC_MCO2EN_BIT_NUMBER 0x9U +#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#if defined(STM32F411xE) +#define IS_RCC_PLLN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) +#else /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || + STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410Tx || STM32F410Cx || + STM32F410Rx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Cx || STM32F412Rx || + STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) +#endif /* STM32F413xx || STM32F423xx */ + +#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ + ((VALUE) == RCC_PLLSAIDIVR_4) ||\ + ((VALUE) == RCC_PLLSAIDIVR_8) ||\ + ((VALUE) == RCC_PLLSAIDIVR_16)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ + ((VALUE) == RCC_PLLI2SP_DIV4) ||\ + ((VALUE) == RCC_PLLI2SP_DIV6) ||\ + ((VALUE) == RCC_PLLI2SP_DIV8)) + +#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) + +#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_CECCLKSOURCE_LSE)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ + ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) + +#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) + +#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#endif /* STM32F413xx || STM32F423xx */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) + +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h index 07cb4702..d6f1a1a6 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -1,2030 +1,2030 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.h - * @author MCD Application Team - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_H -#define STM32F4xx_HAL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. - This parameter can be a value of @ref TIM_AutoReloadPreload */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - -/** - * @brief TIM Input Capture Configuration Structure definition - */ -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClockConfigTypeDef; - -/** - * @brief TIM Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler - This parameter must be 0: When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct -{ - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode - @note When the Master/slave mode is enabled, the effect of - an event on the trigger input (TRGI) is delayed to allow a - perfect synchronization between the current timer and its - slaves (through TRGO). It is not mandatory in case of timer - synchronization mode. */ -} TIM_MasterConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct -{ - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -} TIM_SlaveConfigTypeDef; - -/** - * @brief TIM Break input(s) and Dead time configuration Structure definition - * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable - * filter and polarity. - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode - This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode - This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - uint32_t LockLevel; /*!< TIM Lock level - This parameter can be a value of @ref TIM_Lock_level */ - uint32_t DeadTime; /*!< TIM dead Time - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint32_t BreakState; /*!< TIM Break State - This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - uint32_t BreakPolarity; /*!< TIM Break input polarity - This parameter can be a value of @ref TIM_Break_Polarity */ - uint32_t BreakFilter; /*!< Specifies the break input filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -} TIM_BreakDeadTimeConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ -} HAL_TIM_StateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ -} HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -typedef struct __TIM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ - void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ - void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ - void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ - void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ - void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ - void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ - void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ - void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ - void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ - void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ - void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ - void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ - void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ - void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ - void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ - void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ - void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ - void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ - void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ - void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ - void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ - void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ - void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ - void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ - void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ - void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} TIM_HandleTypeDef; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL TIM Callback ID enumeration definition - */ -typedef enum -{ - HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ - ,HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ - ,HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ - ,HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ - ,HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ - ,HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ - ,HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ - ,HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ - ,HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ - ,HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ - ,HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ - ,HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ - ,HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ - ,HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ - ,HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ - ,HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ - ,HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ - ,HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ - - ,HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ - ,HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ - ,HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ - ,HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ - ,HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ - ,HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ - ,HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ - ,HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ - ,HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ -} HAL_TIM_CallbackIDTypeDef; - -/** - * @brief HAL TIM Callback pointer definition - */ -typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ - -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ -#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base Address - * @{ - */ -#define TIM_DMABASE_CR1 0x00000000U -#define TIM_DMABASE_CR2 0x00000001U -#define TIM_DMABASE_SMCR 0x00000002U -#define TIM_DMABASE_DIER 0x00000003U -#define TIM_DMABASE_SR 0x00000004U -#define TIM_DMABASE_EGR 0x00000005U -#define TIM_DMABASE_CCMR1 0x00000006U -#define TIM_DMABASE_CCMR2 0x00000007U -#define TIM_DMABASE_CCER 0x00000008U -#define TIM_DMABASE_CNT 0x00000009U -#define TIM_DMABASE_PSC 0x0000000AU -#define TIM_DMABASE_ARR 0x0000000BU -#define TIM_DMABASE_RCR 0x0000000CU -#define TIM_DMABASE_CCR1 0x0000000DU -#define TIM_DMABASE_CCR2 0x0000000EU -#define TIM_DMABASE_CCR3 0x0000000FU -#define TIM_DMABASE_CCR4 0x00000010U -#define TIM_DMABASE_BDTR 0x00000011U -#define TIM_DMABASE_DCR 0x00000012U -#define TIM_DMABASE_DMAR 0x00000013U -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ -/** - * @} - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ -#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ -#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State TIM Output Compare State - * @{ - */ -#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ -#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ -/** - * @} - */ - -/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload - * @{ - */ -#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ -#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ -#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State - * @{ - */ -#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ -#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ -#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ -#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ -#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ -#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity - * @{ - */ -#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ -#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ -#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM interrupt Definition - * @{ - */ -#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ -#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ -#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ -#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ -#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ -#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ -#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ -#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ -#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA Sources - * @{ - */ -#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ -#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ -#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ -#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ -#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ -#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ -#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag Definition - * @{ - */ -#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ -#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ -#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ -#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ -#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ -#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ -#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ -#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ -#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ -#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ -#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ -#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ -#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ -#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ -#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ -#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ -#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ -#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ -#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ -#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ -#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ -#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ -#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ -#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ -#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ -#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable - * @{ - */ -#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ -#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Input Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ -#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable - * @{ - */ -#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event - (if none of the break inputs BRK and BRK2 is active) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ -#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ -#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ -#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ -#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ -#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ -#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ -#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ -#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes - * @{ - */ -#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ -#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ -#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ -#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ -#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ -#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ -#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ -#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ -#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ -#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ -#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ -#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ -#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -/** - * @} - */ - -/** @defgroup DMA_Handle_index TIM DMA Handle Index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State TIM Capture/Compare Channel State - * @{ - */ -#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ -#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ -#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ -#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ - -/** @brief Reset TIM handle state. - * @param __HANDLE__ TIM handle. - * @retval None - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->Base_MspInitCallback = NULL; \ - (__HANDLE__)->Base_MspDeInitCallback = NULL; \ - (__HANDLE__)->IC_MspInitCallback = NULL; \ - (__HANDLE__)->IC_MspDeInitCallback = NULL; \ - (__HANDLE__)->OC_MspInitCallback = NULL; \ - (__HANDLE__)->OC_MspDeInitCallback = NULL; \ - (__HANDLE__)->PWM_MspInitCallback = NULL; \ - (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET) -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled unconditionally - */ -#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) - -/** @brief Enable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to enable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) - -/** @brief Disable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to disable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) - -/** @brief Enable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to enable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) - -/** @brief Disable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to disable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) - -/** @brief Check whether the specified TIM interrupt flag is set or not. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified TIM interrupt flag. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to clear. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** - * @brief Check whether the specified TIM interrupt source is enabled or not. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval The state of TIM_IT (SET or RESET). - */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ - == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Clear the TIM interrupt pending bits. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -/** - * @brief Indicates whether or not the TIM Counter is used as downcounter. - * @param __HANDLE__ TIM handle. - * @retval False (Counter used as upcounter) or True (Counter used as downcounter) - * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder -mode. - */ -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) - -/** - * @brief Set the TIM Prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __PRESC__ specifies the Prescaler new value. - * @retval None - */ -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -/** - * @brief Set the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __COUNTER__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Get the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __AUTORELOAD__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) - -/** - * @brief Get the TIM Autoreload Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __CKD__ specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) - -/** - * @brief Get the TIM Clock Division value on runtime. - * @param __HANDLE__ TIM handle. - * @retval The clock division can be one of the following values: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__ specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Get the TIM Input Capture prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval The input capture prescaler can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) - -/** - * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__ specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) - -/** - * @brief Get the TIM Capture Compare Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__HANDLE__)->Instance->CCR4)) - -/** - * @brief Set the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) - -/** - * @brief Reset the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) - -/** - * @brief Enable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is enabled an active edge on the trigger input acts - * like a compare match on CCx output. Delay to sample the trigger - * input and to activate CCx output is reduced to 3 clock cycles. - * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) - -/** - * @brief Disable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is disabled CCx output behaves normally depending - * on counter and CCRx values even when the trigger is ON. The minimum - * delay to activate CCx output when an active edge occurs on the - * trigger input is 5 clock cycles. - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) - -/** - * @brief Set the TIM Capture x input polarity on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__ Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) - -/** - * @} - */ -/* End of exported macros ----------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Constants TIM Private Constants - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ -/* End of private constants --------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR)) - -#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ - ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ - ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) - -#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ - ((__STATE__) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) - -#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ - ((__MODE__) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ - ((__MODE__) == TIM_ENCODERMODE_TI2) || \ - ((__MODE__) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3) || \ - ((__CHANNEL__) == TIM_CHANNEL_4) || \ - ((__CHANNEL__) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3)) - -#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1)) - -#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ - ((__STATE__) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ - ((__STATE__) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) - - -#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ - ((__STATE__) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ - ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ - ((__SOURCE__) == TIM_TRGO_ENABLE) || \ - ((__SOURCE__) == TIM_TRGO_UPDATE) || \ - ((__SOURCE__) == TIM_TRGO_OC1) || \ - ((__SOURCE__) == TIM_TRGO_OC1REF) || \ - ((__SOURCE__) == TIM_TRGO_OC2REF) || \ - ((__SOURCE__) == TIM_TRGO_OC3REF) || \ - ((__SOURCE__) == TIM_TRGO_OC4REF)) - -#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ - ((__MODE__) == TIM_SLAVEMODE_RESET) || \ - ((__MODE__) == TIM_SLAVEMODE_GATED) || \ - ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ - ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ - ((__MODE__) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ - ((__MODE__) == TIM_OCMODE_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_INACTIVE) || \ - ((__MODE__) == TIM_OCMODE_TOGGLE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_TI1F_ED) || \ - ((__SELECTION__) == TIM_TS_TI1FP1) || \ - ((__SELECTION__) == TIM_TS_TI2FP2) || \ - ((__SELECTION__) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ - ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) - -#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) - -/** - * @} - */ -/* End of private macros -----------------------------------------------------*/ - -/* Include TIM HAL Extended module */ -#include "stm32f4xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * @{ - */ -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * @{ - */ -/* Timer Output Compare functions *********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * @{ - */ -/* Timer PWM functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * @{ - */ -/* Timer Input Capture functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * @{ - */ -/* Timer One Pulse functions **************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * @{ - */ -/* Timer Encoder functions ****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * @{ - */ -/* Interrupt Handler functions ***********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -void TIM_ResetCallback(TIM_HandleTypeDef *htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_TIM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.h + * @author MCD Application Team + * @brief Header file of TIM HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_H +#define STM32F4xx_HAL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIM_Exported_Types TIM Exported Types + * @{ + */ + +/** + * @brief TIM Time base Configuration Structure definition + */ +typedef struct +{ + uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint32_t Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_ClockDivision */ + + uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + GP timers: this parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + Advanced timers: this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. + This parameter can be a value of @ref TIM_AutoReloadPreload */ +} TIM_Base_InitTypeDef; + +/** + * @brief TIM Output Compare Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCFastMode; /*!< Specifies the Fast mode state. + This parameter can be a value of @ref TIM_Output_Fast_State + @note This parameter is valid only in PWM1 and PWM2 mode. */ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ +} TIM_OC_InitTypeDef; + +/** + * @brief TIM One Pulse Mode Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_OnePulse_InitTypeDef; + +/** + * @brief TIM Input Capture Configuration Structure definition + */ +typedef struct +{ + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_IC_InitTypeDef; + +/** + * @brief TIM Encoder Configuration Structure definition + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Mode */ + + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC1Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC2Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC2Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_Encoder_InitTypeDef; + +/** + * @brief Clock Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< TIM clock sources + This parameter can be a value of @ref TIM_Clock_Source */ + uint32_t ClockPolarity; /*!< TIM clock polarity + This parameter can be a value of @ref TIM_Clock_Polarity */ + uint32_t ClockPrescaler; /*!< TIM clock prescaler + This parameter can be a value of @ref TIM_Clock_Prescaler */ + uint32_t ClockFilter; /*!< TIM clock filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClockConfigTypeDef; + +/** + * @brief TIM Clear Input Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClearInputState; /*!< TIM clear Input state + This parameter can be ENABLE or DISABLE */ + uint32_t ClearInputSource; /*!< TIM clear Input sources + This parameter can be a value of @ref TIM_ClearInput_Source */ + uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity + This parameter can be a value of @ref TIM_ClearInput_Polarity */ + uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler + This parameter must be 0: When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + uint32_t ClearInputFilter; /*!< TIM Clear Input filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClearInputConfigTypeDef; + +/** + * @brief TIM Master configuration Structure definition + */ +typedef struct +{ + uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection */ + uint32_t MasterSlaveMode; /*!< Master/slave mode selection + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ +} TIM_MasterConfigTypeDef; + +/** + * @brief TIM Slave configuration Structure definition + */ +typedef struct +{ + uint32_t SlaveMode; /*!< Slave mode selection + This parameter can be a value of @ref TIM_Slave_Mode */ + uint32_t InputTrigger; /*!< Input Trigger source + This parameter can be a value of @ref TIM_Trigger_Selection */ + uint32_t TriggerPolarity; /*!< Input Trigger polarity + This parameter can be a value of @ref TIM_Trigger_Polarity */ + uint32_t TriggerPrescaler; /*!< Input trigger prescaler + This parameter can be a value of @ref TIM_Trigger_Prescaler */ + uint32_t TriggerFilter; /*!< Input trigger filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + +} TIM_SlaveConfigTypeDef; + +/** + * @brief TIM Break input(s) and Dead time configuration Structure definition + * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable + * filter and polarity. + */ +typedef struct +{ + uint32_t OffStateRunMode; /*!< TIM off state in run mode + This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ + uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode + This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ + uint32_t LockLevel; /*!< TIM Lock level + This parameter can be a value of @ref TIM_Lock_level */ + uint32_t DeadTime; /*!< TIM dead Time + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint32_t BreakState; /*!< TIM Break State + This parameter can be a value of @ref TIM_Break_Input_enable_disable */ + uint32_t BreakPolarity; /*!< TIM Break input polarity + This parameter can be a value of @ref TIM_Break_Polarity */ + uint32_t BreakFilter; /*!< Specifies the break input filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BreakDeadTimeConfigTypeDef; + +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ + HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ + HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ +} HAL_TIM_StateTypeDef; + +/** + * @brief HAL Active channel structures definition + */ +typedef enum +{ + HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ + HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ + HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ + HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ + HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ +} HAL_TIM_ActiveChannel; + +/** + * @brief TIM Time Base Handle Structure definition + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +typedef struct __TIM_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +{ + TIM_TypeDef *Instance; /*!< Register base address */ + TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ + HAL_TIM_ActiveChannel Channel; /*!< Active channel */ + DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array + This array is accessed by a @ref DMA_Handle_index */ + HAL_LockTypeDef Lock; /*!< Locking object */ + __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ + void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ + void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ + void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ + void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ + void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ + void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ + void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ + void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ + void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ + void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ + void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ + void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ + void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ + void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ + void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ + void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ + void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ + void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ + void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ + void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ + void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ + void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ + void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ + void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ + void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ + void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} TIM_HandleTypeDef; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief HAL TIM Callback ID enumeration definition + */ +typedef enum +{ + HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ + ,HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ + ,HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ + ,HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ + ,HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ + ,HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ + ,HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ + ,HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ + ,HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ + ,HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ + ,HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ + ,HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ + ,HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ + ,HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ + ,HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ + ,HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ + ,HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ + ,HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ + + ,HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ + ,HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ + ,HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ + ,HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ + ,HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ + ,HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ + ,HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ + ,HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ + ,HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ +} HAL_TIM_CallbackIDTypeDef; + +/** + * @brief HAL TIM Callback pointer definition + */ +typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ + +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_ClearInput_Source TIM Clear Input Source + * @{ + */ +#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ +#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address TIM DMA Base Address + * @{ + */ +#define TIM_DMABASE_CR1 0x00000000U +#define TIM_DMABASE_CR2 0x00000001U +#define TIM_DMABASE_SMCR 0x00000002U +#define TIM_DMABASE_DIER 0x00000003U +#define TIM_DMABASE_SR 0x00000004U +#define TIM_DMABASE_EGR 0x00000005U +#define TIM_DMABASE_CCMR1 0x00000006U +#define TIM_DMABASE_CCMR2 0x00000007U +#define TIM_DMABASE_CCER 0x00000008U +#define TIM_DMABASE_CNT 0x00000009U +#define TIM_DMABASE_PSC 0x0000000AU +#define TIM_DMABASE_ARR 0x0000000BU +#define TIM_DMABASE_RCR 0x0000000CU +#define TIM_DMABASE_CCR1 0x0000000DU +#define TIM_DMABASE_CCR2 0x0000000EU +#define TIM_DMABASE_CCR3 0x0000000FU +#define TIM_DMABASE_CCR4 0x00000010U +#define TIM_DMABASE_BDTR 0x00000011U +#define TIM_DMABASE_DCR 0x00000012U +#define TIM_DMABASE_DMAR 0x00000013U +/** + * @} + */ + +/** @defgroup TIM_Event_Source TIM Event Source + * @{ + */ +#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ +#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ +#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ +#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ +#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ +#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ +#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ +#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ +/** + * @} + */ + +/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity + * @{ + */ +#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Polarity TIM ETR Polarity + * @{ + */ +#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ +#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler + * @{ + */ +#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ +#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ +#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ +#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode TIM Counter Mode + * @{ + */ +#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ +#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ +#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ +#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ +#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ +/** + * @} + */ + +/** @defgroup TIM_ClockDivision TIM Clock Division + * @{ + */ +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_State TIM Output Compare State + * @{ + */ +#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ +#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ +/** + * @} + */ + +/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload + * @{ + */ +#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ +#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ + +/** + * @} + */ + +/** @defgroup TIM_Output_Fast_State TIM Output Fast State + * @{ + */ +#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ +#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State + * @{ + */ +#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ +#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity + * @{ + */ +#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ +#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity + * @{ + */ +#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ +#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State + * @{ + */ +#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ +#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State + * @{ + */ +#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ +#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity + * @{ + */ +#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ +#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ +#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection + * @{ + */ +#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively */ +#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler + * @{ + */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ +#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ +#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode + * @{ + */ +#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode TIM Encoder Mode + * @{ + */ +#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ +#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ +#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ +/** + * @} + */ + +/** @defgroup TIM_Interrupt_definition TIM interrupt Definition + * @{ + */ +#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ +#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ +#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ +#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ +#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ +#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ +#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ +#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ +/** + * @} + */ + +/** @defgroup TIM_Commutation_Source TIM Commutation Source + * @{ + */ +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ +/** + * @} + */ + +/** @defgroup TIM_DMA_sources TIM DMA Sources + * @{ + */ +#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ +#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ +#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ +#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ +#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ +#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ +#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ +/** + * @} + */ + +/** @defgroup TIM_Flag_definition TIM Flag Definition + * @{ + */ +#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ +#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ +#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ +#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ +#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ +#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ +#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ +#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ +#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ +#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ +#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ +#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ +/** + * @} + */ + +/** @defgroup TIM_Channel TIM Channel + * @{ + */ +#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ +#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ +#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ +#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ +#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Source TIM Clock Source + * @{ + */ +#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ +#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ +#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ +#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ +#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ +#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ +#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ +#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ +#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ +#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Polarity TIM Clock Polarity + * @{ + */ +#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler + * @{ + */ +#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ +#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ +#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity + * @{ + */ +#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ +#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler + * @{ + */ +#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state + * @{ + */ +#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ + +/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state + * @{ + */ +#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ +/** @defgroup TIM_Lock_level TIM Lock level + * @{ + */ +#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ +#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable + * @{ + */ +#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ +#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ +/** + * @} + */ + +/** @defgroup TIM_Break_Polarity TIM Break Input Polarity + * @{ + */ +#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ +#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable + * @{ + */ +#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event + (if none of the break inputs BRK and BRK2 is active) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection + * @{ + */ +#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ +#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ +#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ +#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode + * @{ + */ +#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ +#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode TIM Slave mode + * @{ + */ +#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ +#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ +#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ +#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ +#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes + * @{ + */ +#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ +#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ +#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ +#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ +#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ +#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ +#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ +#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Selection TIM Trigger Selection + * @{ + */ +#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ +#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ +#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ +#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ +#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ +#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ +#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ +#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ +#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity + * @{ + */ +#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler + * @{ + */ +#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ +#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ +#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection + * @{ + */ +#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ +#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length + * @{ + */ +#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +/** + * @} + */ + +/** @defgroup DMA_Handle_index TIM DMA Handle Index + * @{ + */ +#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ +#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ +#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ +#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ +#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ +#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ +#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ +/** + * @} + */ + +/** @defgroup Channel_CC_State TIM Capture/Compare Channel State + * @{ + */ +#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ +#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ +#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ +#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup TIM_Exported_Macros TIM Exported Macros + * @{ + */ + +/** @brief Reset TIM handle state. + * @param __HANDLE__ TIM handle. + * @retval None + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->Base_MspInitCallback = NULL; \ + (__HANDLE__)->Base_MspDeInitCallback = NULL; \ + (__HANDLE__)->IC_MspInitCallback = NULL; \ + (__HANDLE__)->IC_MspDeInitCallback = NULL; \ + (__HANDLE__)->OC_MspInitCallback = NULL; \ + (__HANDLE__)->OC_MspDeInitCallback = NULL; \ + (__HANDLE__)->PWM_MspInitCallback = NULL; \ + (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET) +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @brief Enable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) + +/** + * @brief Enable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) + +/** + * @brief Disable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled + */ +#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled unconditionally + */ +#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) + +/** @brief Enable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to enable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) + +/** @brief Disable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to disable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +/** @brief Enable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to enable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + +/** @brief Disable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to disable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) + +/** @brief Check whether the specified TIM interrupt flag is set or not. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) + +/** @brief Clear the specified TIM interrupt flag. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to clear. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** + * @brief Check whether the specified TIM interrupt source is enabled or not. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval The state of TIM_IT (SET or RESET). + */ +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Clear the TIM interrupt pending bits. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) + +/** + * @brief Indicates whether or not the TIM Counter is used as downcounter. + * @param __HANDLE__ TIM handle. + * @retval False (Counter used as upcounter) or True (Counter used as downcounter) + * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder +mode. + */ +#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) + +/** + * @brief Set the TIM Prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __PRESC__ specifies the Prescaler new value. + * @retval None + */ +#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) + +/** + * @brief Set the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __COUNTER__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) + +/** + * @brief Get the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) + */ +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) + +/** + * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __AUTORELOAD__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) + +/** + * @brief Get the TIM Autoreload Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) + */ +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) + +/** + * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __CKD__ specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + * @retval None + */ +#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) + +/** + * @brief Get the TIM Clock Division value on runtime. + * @param __HANDLE__ TIM handle. + * @retval The clock division can be one of the following values: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + */ +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) + +/** + * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __ICPSC__ specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) + +/** + * @brief Get the TIM Input Capture prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get input capture 1 prescaler value + * @arg TIM_CHANNEL_2: get input capture 2 prescaler value + * @arg TIM_CHANNEL_3: get input capture 3 prescaler value + * @arg TIM_CHANNEL_4: get input capture 4 prescaler value + * @retval The input capture prescaler can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + */ +#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ + (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) + +/** + * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __COMPARE__ specifies the Capture Compare register new value. + * @retval None + */ +#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) + +/** + * @brief Get the TIM Capture Compare Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channel associated with the capture compare register + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get capture/compare 1 register value + * @arg TIM_CHANNEL_2: get capture/compare 2 register value + * @arg TIM_CHANNEL_3: get capture/compare 3 register value + * @arg TIM_CHANNEL_4: get capture/compare 4 register value + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) + */ +#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__HANDLE__)->Instance->CCR4)) + +/** + * @brief Set the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) + +/** + * @brief Reset the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) + +/** + * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is set, only counter + * overflow/underflow generates an update interrupt or DMA request (if + * enabled) + * @retval None + */ +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) + +/** + * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is reset, any of the + * following events generate an update interrupt or DMA request (if + * enabled): + * _ Counter overflow underflow + * _ Setting the UG bit + * _ Update generation through the slave mode controller + * @retval None + */ +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) + +/** + * @brief Set the TIM Capture x input polarity on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __POLARITY__ Polarity for TIx source + * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge + * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge + * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge + * @retval None + */ +#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) + +/** + * @} + */ +/* End of exported macros ----------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_Private_Constants TIM Private Constants + * @{ + */ +/* The counter of a timer instance is disabled only if all the CCx and CCxN + channels have been disabled */ +#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) +#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_Private_Macros TIM Private Macros + * @{ + */ +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) + +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR)) + +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ + ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) + +#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) + +#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ + ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) + +#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ + ((__STATE__) == TIM_OCFAST_ENABLE)) + +#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCPOLARITY_LOW)) + +#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) + +#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCIDLESTATE_RESET)) + +#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCNIDLESTATE_RESET)) + +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + +#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) + +#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_TRC)) + +#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV8)) + +#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ + ((__MODE__) == TIM_OPMODE_REPETITIVE)) + +#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ + ((__MODE__) == TIM_ENCODERMODE_TI2) || \ + ((__MODE__) == TIM_ENCODERMODE_TI12)) + +#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3) || \ + ((__CHANNEL__) == TIM_CHANNEL_4) || \ + ((__CHANNEL__) == TIM_CHANNEL_ALL)) + +#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2)) + +#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3)) + +#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1)) + +#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) + +#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) + +#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) + +#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) + +#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ + ((__STATE__) == TIM_OSSR_DISABLE)) + +#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ + ((__STATE__) == TIM_OSSI_DISABLE)) + +#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_3)) + +#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) + + +#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ + ((__STATE__) == TIM_BREAK_DISABLE)) + +#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) + +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ + ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) + +#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ + ((__SOURCE__) == TIM_TRGO_ENABLE) || \ + ((__SOURCE__) == TIM_TRGO_UPDATE) || \ + ((__SOURCE__) == TIM_TRGO_OC1) || \ + ((__SOURCE__) == TIM_TRGO_OC1REF) || \ + ((__SOURCE__) == TIM_TRGO_OC2REF) || \ + ((__SOURCE__) == TIM_TRGO_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO_OC4REF)) + +#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ + ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) + +#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ + ((__MODE__) == TIM_SLAVEMODE_RESET) || \ + ((__MODE__) == TIM_SLAVEMODE_GATED) || \ + ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ + ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) + +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2)) + +#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ + ((__MODE__) == TIM_OCMODE_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_INACTIVE) || \ + ((__MODE__) == TIM_OCMODE_TOGGLE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) + +#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_TI1F_ED) || \ + ((__SELECTION__) == TIM_TS_TI1FP1) || \ + ((__SELECTION__) == TIM_TS_TI2FP2) || \ + ((__SELECTION__) == TIM_TS_ETRF)) + +#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_NONE)) + +#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) + +#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) + +#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ + ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) + +#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) + +#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) + +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) + +#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + +#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) + +#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + +#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + +/** + * @} + */ +/* End of private macros -----------------------------------------------------*/ + +/* Include TIM HAL Extended module */ +#include "stm32f4xx_hal_tim_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * @{ + */ +/* Time Base functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * @{ + */ +/* Timer Output Compare functions *********************************************/ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * @{ + */ +/* Timer PWM functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * @{ + */ +/* Timer Input Capture functions **********************************************/ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * @{ + */ +/* Timer One Pulse functions **************************************************/ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * @{ + */ +/* Timer Encoder functions ****************************************************/ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief IRQ handler management + * @{ + */ +/* Interrupt Handler functions ***********************************************/ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Control functions *********************************************************/ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); +uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * @{ + */ +/* Callback in non blocking modes (Interrupt and DMA) *************************/ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +/* Peripheral State functions ************************************************/ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); + +void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_DMAError(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +void TIM_ResetCallback(TIM_HandleTypeDef *htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_TIM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h index 2ffd2d7d..88ce2817 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h @@ -1,356 +1,356 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.h - * @author MCD Application Team - * @brief Header file of TIM HAL Extended module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_EX_H -#define STM32F4xx_HAL_TIM_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Extended Remapping - * @{ - */ -#if defined (TIM2) -#if defined(TIM8) -#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ -#else -#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ -#endif /* TIM8 */ -#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ -#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ -#endif /* TIM2 */ - -#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ -#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ -#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ -#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ - -#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ -#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ -#if defined(SPDIFRX) -#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ -#endif /* SPDIFRX*/ - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define LPTIM_REMAP_MASK 0x10000000U - -#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ -#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros - * @{ - */ - -/** - * @} - */ -/* End of exported macro -----------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros - * @{ - */ -#if defined(SPDIFRX) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#elif defined(TIM2) -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE))) || \ - (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ - (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM9_LPTIM)))) -#elif defined(TIM8) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* SPDIFRX */ - -/** - * @} - */ -/* End of private macro ------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); - -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * @{ - */ -/* Extended Callback **********************************************************/ -void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * @{ - */ -/* Extended Peripheral State functions ***************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions - * @{ - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* STM32F4xx_HAL_TIM_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.h + * @author MCD Application Team + * @brief Header file of TIM HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_EX_H +#define STM32F4xx_HAL_TIM_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIMEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types + * @{ + */ + +/** + * @brief TIM Hall sensor Configuration Structure definition + */ + +typedef struct +{ + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ +} TIM_HallSensor_InitTypeDef; +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants + * @{ + */ + +/** @defgroup TIMEx_Remap TIM Extended Remapping + * @{ + */ +#if defined (TIM2) +#if defined(TIM8) +#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ +#else +#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ +#endif /* TIM8 */ +#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ +#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ +#endif /* TIM2 */ + +#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ +#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ +#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ +#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ + +#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ +#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ +#if defined(SPDIFRX) +#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ +#endif /* SPDIFRX*/ + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define LPTIM_REMAP_MASK 0x10000000U + +#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ +#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros + * @{ + */ + +/** + * @} + */ +/* End of exported macro -----------------------------------------------------*/ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros + * @{ + */ +#if defined(SPDIFRX) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#elif defined(TIM2) +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE))) || \ + (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ + (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM9_LPTIM)))) +#elif defined(TIM8) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* SPDIFRX */ + +/** + * @} + */ +/* End of private macro ------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * @{ + */ +/* Timer Hall Sensor functions **********************************************/ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); + +void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); + +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * @{ + */ +/* Timer Complementary Output Compare functions *****************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * @{ + */ +/* Timer Complementary PWM functions ****************************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * @{ + */ +/* Timer Complementary One Pulse functions **********************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Extended Control functions ************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * @{ + */ +/* Extended Callback **********************************************************/ +void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * @{ + */ +/* Extended Peripheral State functions ***************************************/ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F4xx_HAL_TIM_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c index a27c14c7..245147a1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -1,615 +1,615 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.c - * @author MCD Application Team - * @brief HAL module driver. - * This is the common part of the HAL initialization - * - @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 - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup HAL_Private_Constants - * @{ - */ -/** - * @brief STM32F4xx HAL Driver version number V1.7.8 - */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x08U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ - |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ - |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ - |(__STM32F4xx_HAL_VERSION_RC)) - -#define IDCODE_DEVID_MASK 0x00000FFFU - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- MEMRMP Register ---*/ -/* Alias word address of UFB_MODE bit */ -#define MEMRMP_OFFSET SYSCFG_OFFSET -#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos -#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) -#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos -#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) - -/* --- MCHDLYCR Register ---*/ -/* Alias word address of BSCKSEL bit */ -#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) -#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos -#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup HAL_Private_Variables - * @{ - */ -__IO uint32_t uwTick; -uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ -HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Functions HAL Exported Functions - * @{ - */ - -/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initializes the Flash interface the NVIC allocation and initial clock - configuration. It initializes the systick also when timeout is needed - and the backup domain when enabled. - (+) De-Initializes common part of the HAL. - (+) Configure the time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user - can eventually implement his proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (HAL_InitTick ()) is called automatically - at the beginning of the program after reset by HAL_Init() or at any time - when clock is configured, by HAL_RCC_ClockConfig(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if HAL_Delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) functions affecting time base configurations are declared as __weak - to make override possible in case of other implementations in user file. -@endverbatim - * @{ - */ - -/** - * @brief This function is used to initialize the HAL Library; it must be the first - * instruction to be executed in the main program (before to call any other - * HAL function), it performs the following: - * Configure the Flash prefetch, instruction and Data caches. - * Configures the SysTick to generate an interrupt each 1 millisecond, - * which is clocked by the HSI (at this stage, the clock is not yet - * configured and thus the system is running from the internal HSI at 16 MHz). - * Set NVIC Group Priority to 4. - * Calls the HAL_MspInit() callback function defined in user file - * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization - * - * @note SysTick is used as time base for the HAL_Delay() function, the application - * need to ensure that the SysTick time base is always set to 1 millisecond - * to have correct HAL operation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_Init(void) -{ - /* Configure Flash prefetch, Instruction cache, Data cache */ -#if (INSTRUCTION_CACHE_ENABLE != 0U) - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (DATA_CACHE_ENABLE != 0U) - __HAL_FLASH_DATA_CACHE_ENABLE(); -#endif /* DATA_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Set Interrupt Group Priority */ - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - /* Init the low level hardware */ - HAL_MspInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function de-Initializes common part of the HAL and stops the systick. - * This function is optional. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DeInit(void) -{ - /* Reset of all peripherals */ - __HAL_RCC_APB1_FORCE_RESET(); - __HAL_RCC_APB1_RELEASE_RESET(); - - __HAL_RCC_APB2_FORCE_RESET(); - __HAL_RCC_APB2_RELEASE_RESET(); - - __HAL_RCC_AHB1_FORCE_RESET(); - __HAL_RCC_AHB1_RELEASE_RESET(); - - __HAL_RCC_AHB2_FORCE_RESET(); - __HAL_RCC_AHB2_RELEASE_RESET(); - - __HAL_RCC_AHB3_FORCE_RESET(); - __HAL_RCC_AHB3_RELEASE_RESET(); - - /* De-Init the low level hardware */ - HAL_MspDeInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initialize the MSP. - * @retval None - */ -__weak void HAL_MspInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the MSP. - * @retval None - */ -__weak void HAL_MspDeInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function configures the source of the time base. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). - * @note In the default implementation, SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals. - * Care must be taken if HAL_Delay() is called from a peripheral ISR process, - * The SysTick interrupt must have higher priority (numerically lower) - * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. - * The function is declared as __weak to be overwritten in case of other - * implementation in user file. - * @param TickPriority Tick interrupt priority. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - /* Configure the SysTick to have interrupt in 1ms time basis*/ - if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - { - return HAL_ERROR; - } - - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - return HAL_ERROR; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Provide a tick value in millisecond - (+) Provide a blocking delay in millisecond - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - (+) Get the device identifier - (+) Get the device revision identifier - (+) Enable/Disable Debug module during SLEEP mode - (+) Enable/Disable Debug module during STOP mode - (+) Enable/Disable Debug module during STANDBY mode - -@endverbatim - * @{ - */ - -/** - * @brief This function is called to increment a global variable "uwTick" - * used as application time base. - * @note In the default implementation, this variable is incremented each 1ms - * in SysTick ISR. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_IncTick(void) -{ - uwTick += uwTickFreq; -} - -/** - * @brief Provides a tick value in millisecond. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval tick value - */ -__weak uint32_t HAL_GetTick(void) -{ - return uwTick; -} - -/** - * @brief This function returns a tick priority. - * @retval tick priority - */ -uint32_t HAL_GetTickPrio(void) -{ - return uwTickPrio; -} - -/** - * @brief Set new tick Freq. - * @retval Status - */ -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_TickFreqTypeDef prevTickFreq; - - assert_param(IS_TICKFREQ(Freq)); - - if (uwTickFreq != Freq) - { - /* Back up uwTickFreq frequency */ - prevTickFreq = uwTickFreq; - - /* Update uwTickFreq global variable used by HAL_InitTick() */ - uwTickFreq = Freq; - - /* Apply the new tick Freq */ - status = HAL_InitTick(uwTickPrio); - - if (status != HAL_OK) - { - /* Restore previous tick frequency */ - uwTickFreq = prevTickFreq; - } - } - - return status; -} - -/** - * @brief Return tick frequency. - * @retval tick period in Hz - */ -HAL_TickFreqTypeDef HAL_GetTickFreq(void) -{ - return uwTickFreq; -} - -/** - * @brief This function provides minimum delay (in milliseconds) based - * on variable incremented. - * @note In the default implementation , SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals where uwTick - * is incremented. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = Delay; - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - { - wait += (uint32_t)(uwTickFreq); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/** - * @brief Suspend Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() - * is called, the SysTick interrupt will be disabled and so Tick increment - * is suspended. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_SuspendTick(void) -{ - /* Disable SysTick Interrupt */ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Resume Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() - * is called, the SysTick interrupt will be enabled and so Tick increment - * is resumed. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_ResumeTick(void) -{ - /* Enable SysTick Interrupt */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Returns the HAL revision - * @retval version : 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t HAL_GetHalVersion(void) -{ - return __STM32F4xx_HAL_VERSION; -} - -/** - * @brief Returns the device revision identifier. - * @retval Device revision identifier - */ -uint32_t HAL_GetREVID(void) -{ - return((DBGMCU->IDCODE) >> 16U); -} - -/** - * @brief Returns the device identifier. - * @retval Device identifier - */ -uint32_t HAL_GetDEVID(void) -{ - return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Enables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_EnableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; -} - -/** - * @brief Power-down the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_DisableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns first word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw0(void) -{ - return (READ_REG(*((uint32_t *)UID_BASE))); -} - -/** - * @brief Returns second word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw1(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); -} - -/** - * @brief Returns third word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw2(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Enables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_EnableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_DisableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + @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 + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup HAL_Private_Constants + * @{ + */ +/** + * @brief STM32F4xx HAL Driver version number V1.7.8 + */ +#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_HAL_VERSION_SUB2 (0x08U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ + |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ + |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ + |(__STM32F4xx_HAL_VERSION_RC)) + +#define IDCODE_DEVID_MASK 0x00000FFFU + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) +/* --- MEMRMP Register ---*/ +/* Alias word address of UFB_MODE bit */ +#define MEMRMP_OFFSET SYSCFG_OFFSET +#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos +#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) + +/* --- CMPCR Register ---*/ +/* Alias word address of CMP_PD bit */ +#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) +#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos +#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) + +/* --- MCHDLYCR Register ---*/ +/* Alias word address of BSCKSEL bit */ +#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) +#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos +#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup HAL_Private_Variables + * @{ + */ +__IO uint32_t uwTick; +uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ +HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Functions HAL Exported Functions + * @{ + */ + +/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initializes the Flash interface the NVIC allocation and initial clock + configuration. It initializes the systick also when timeout is needed + and the backup domain when enabled. + (+) De-Initializes common part of the HAL. + (+) Configure the time base source to have 1ms time base with a dedicated + Tick interrupt priority. + (++) SysTick timer is used by default as source of time base, but user + can eventually implement his proper time base source (a general purpose + timer for example or other time source), keeping in mind that Time base + duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and + handled in milliseconds basis. + (++) Time base configuration function (HAL_InitTick ()) is called automatically + at the beginning of the program after reset by HAL_Init() or at any time + when clock is configured, by HAL_RCC_ClockConfig(). + (++) Source of time base is configured to generate interrupts at regular + time intervals. Care must be taken if HAL_Delay() is called from a + peripheral ISR process, the Tick interrupt line must have higher priority + (numerically lower) than the peripheral interrupt. Otherwise the caller + ISR process will be blocked. + (++) functions affecting time base configurations are declared as __weak + to make override possible in case of other implementations in user file. +@endverbatim + * @{ + */ + +/** + * @brief This function is used to initialize the HAL Library; it must be the first + * instruction to be executed in the main program (before to call any other + * HAL function), it performs the following: + * Configure the Flash prefetch, instruction and Data caches. + * Configures the SysTick to generate an interrupt each 1 millisecond, + * which is clocked by the HSI (at this stage, the clock is not yet + * configured and thus the system is running from the internal HSI at 16 MHz). + * Set NVIC Group Priority to 4. + * Calls the HAL_MspInit() callback function defined in user file + * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization + * + * @note SysTick is used as time base for the HAL_Delay() function, the application + * need to ensure that the SysTick time base is always set to 1 millisecond + * to have correct HAL operation. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_Init(void) +{ + /* Configure Flash prefetch, Instruction cache, Data cache */ +#if (INSTRUCTION_CACHE_ENABLE != 0U) + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); +#endif /* INSTRUCTION_CACHE_ENABLE */ + +#if (DATA_CACHE_ENABLE != 0U) + __HAL_FLASH_DATA_CACHE_ENABLE(); +#endif /* DATA_CACHE_ENABLE */ + +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ + HAL_InitTick(TICK_INT_PRIORITY); + + /* Init the low level hardware */ + HAL_MspInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief This function de-Initializes common part of the HAL and stops the systick. + * This function is optional. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DeInit(void) +{ + /* Reset of all peripherals */ + __HAL_RCC_APB1_FORCE_RESET(); + __HAL_RCC_APB1_RELEASE_RESET(); + + __HAL_RCC_APB2_FORCE_RESET(); + __HAL_RCC_APB2_RELEASE_RESET(); + + __HAL_RCC_AHB1_FORCE_RESET(); + __HAL_RCC_AHB1_RELEASE_RESET(); + + __HAL_RCC_AHB2_FORCE_RESET(); + __HAL_RCC_AHB2_RELEASE_RESET(); + + __HAL_RCC_AHB3_FORCE_RESET(); + __HAL_RCC_AHB3_RELEASE_RESET(); + + /* De-Init the low level hardware */ + HAL_MspDeInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Initialize the MSP. + * @retval None + */ +__weak void HAL_MspInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the MSP. + * @retval None + */ +__weak void HAL_MspDeInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief This function configures the source of the time base. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). + * @note In the default implementation, SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals. + * Care must be taken if HAL_Delay() is called from a peripheral ISR process, + * The SysTick interrupt must have higher priority (numerically lower) + * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. + * The function is declared as __weak to be overwritten in case of other + * implementation in user file. + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + /* Configure the SysTick to have interrupt in 1ms time basis*/ + if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + { + return HAL_ERROR; + } + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + return HAL_ERROR; + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions + * @brief HAL Control functions + * +@verbatim + =============================================================================== + ##### HAL Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Provide a tick value in millisecond + (+) Provide a blocking delay in millisecond + (+) Suspend the time base source interrupt + (+) Resume the time base source interrupt + (+) Get the HAL API driver version + (+) Get the device identifier + (+) Get the device revision identifier + (+) Enable/Disable Debug module during SLEEP mode + (+) Enable/Disable Debug module during STOP mode + (+) Enable/Disable Debug module during STANDBY mode + +@endverbatim + * @{ + */ + +/** + * @brief This function is called to increment a global variable "uwTick" + * used as application time base. + * @note In the default implementation, this variable is incremented each 1ms + * in SysTick ISR. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_IncTick(void) +{ + uwTick += uwTickFreq; +} + +/** + * @brief Provides a tick value in millisecond. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval tick value + */ +__weak uint32_t HAL_GetTick(void) +{ + return uwTick; +} + +/** + * @brief This function returns a tick priority. + * @retval tick priority + */ +uint32_t HAL_GetTickPrio(void) +{ + return uwTickPrio; +} + +/** + * @brief Set new tick Freq. + * @retval Status + */ +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + + assert_param(IS_TICKFREQ(Freq)); + + if (uwTickFreq != Freq) + { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ + uwTickFreq = Freq; + + /* Apply the new tick Freq */ + status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } + } + + return status; +} + +/** + * @brief Return tick frequency. + * @retval tick period in Hz + */ +HAL_TickFreqTypeDef HAL_GetTickFreq(void) +{ + return uwTickFreq; +} + +/** + * @brief This function provides minimum delay (in milliseconds) based + * on variable incremented. + * @note In the default implementation , SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals where uwTick + * is incremented. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +__weak void HAL_Delay(uint32_t Delay) +{ + uint32_t tickstart = HAL_GetTick(); + uint32_t wait = Delay; + + /* Add a freq to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + { + wait += (uint32_t)(uwTickFreq); + } + + while((HAL_GetTick() - tickstart) < wait) + { + } +} + +/** + * @brief Suspend Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() + * is called, the SysTick interrupt will be disabled and so Tick increment + * is suspended. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_SuspendTick(void) +{ + /* Disable SysTick Interrupt */ + SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Resume Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() + * is called, the SysTick interrupt will be enabled and so Tick increment + * is resumed. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_ResumeTick(void) +{ + /* Enable SysTick Interrupt */ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Returns the HAL revision + * @retval version : 0xXYZR (8bits for each decimal, R for RC) + */ +uint32_t HAL_GetHalVersion(void) +{ + return __STM32F4xx_HAL_VERSION; +} + +/** + * @brief Returns the device revision identifier. + * @retval Device revision identifier + */ +uint32_t HAL_GetREVID(void) +{ + return((DBGMCU->IDCODE) >> 16U); +} + +/** + * @brief Returns the device identifier. + * @retval Device identifier + */ +uint32_t HAL_GetDEVID(void) +{ + return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Enables the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_EnableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; +} + +/** + * @brief Power-down the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_DisableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns first word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw0(void) +{ + return (READ_REG(*((uint32_t *)UID_BASE))); +} + +/** + * @brief Returns second word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw1(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); +} + +/** + * @brief Returns third word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw2(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Enables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_EnableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_DisableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c index f4ad9fa9..2efb9864 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c @@ -1,505 +1,505 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.c - * @author MCD Application Team - * @brief CORTEX HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the CORTEX: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - - [..] - *** How to configure Interrupts using CORTEX HAL driver *** - =========================================================== - [..] - This section provides functions allowing to configure the NVIC interrupts (IRQ). - The Cortex-M4 exceptions are managed by CMSIS functions. - - (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() - function according to the following table. - (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). - (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programming manual for details in how to configure priority. - - -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. - The pending IRQ priority will be managed only by the sub priority. - - -@- IRQ priority order (sorted by highest to lowest priority): - (+@) Lowest preemption priority - (+@) Lowest sub priority - (+@) Lowest hardware priority (IRQ number) - - [..] - *** How to configure Systick using CORTEX HAL driver *** - ======================================================== - [..] - Setup SysTick Timer for time base. - - (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which - is a CMSIS function that: - (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value 0x0F. - (++) Resets the SysTick Counter register. - (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). - (++) Enables the SysTick Interrupt. - (++) Starts the SysTick Counter. - - (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro - __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the - HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined - inside the stm32f4xx_hal_cortex.h file. - - (+) You can change the SysTick IRQ priority by calling the - HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function - call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. - - (+) To adjust the SysTick time base, use the following formula: - - Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function - (++) Reload Value should not exceed 0xFFFFFF - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CORTEX CORTEX - * @brief CORTEX HAL module driver - * @{ - */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions - * @{ - */ - - -/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - - -/** - * @brief Sets the priority grouping field (preemption priority and subpriority) - * using the required unlock sequence. - * @param PriorityGroup The priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ - NVIC_SetPriorityGrouping(PriorityGroup); -} - -/** - * @brief Sets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PreemptPriority The preemption priority for the IRQn channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority - * @param SubPriority the subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority. - * @retval None - */ -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t prioritygroup = 0x00U; - - /* Check the parameters */ - assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); - - prioritygroup = NVIC_GetPriorityGrouping(); - - NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); -} - -/** - * @brief Enables a device specific interrupt in the NVIC interrupt controller. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Enable interrupt */ - NVIC_EnableIRQ(IRQn); -} - -/** - * @brief Disables a device specific interrupt in the NVIC interrupt controller. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Disable interrupt */ - NVIC_DisableIRQ(IRQn); -} - -/** - * @brief Initiates a system reset request to reset the MCU. - * @retval None - */ -void HAL_NVIC_SystemReset(void) -{ - /* System Reset */ - NVIC_SystemReset(); -} - -/** - * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. - * @retval status: - 0 Function succeeded. - * - 1 Function failed. - */ -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) -{ - return SysTick_Config(TicksNumb); -} -/** - * @} - */ - -/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - * @brief Disables the MPU - * @retval None - */ -void HAL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU and clear the control register*/ - MPU->CTRL = 0U; -} - -/** - * @brief Enable the MPU. - * @param MPU_Control Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - /* Ensure MPU setting take effects */ - __DSB(); - __ISB(); -} - -/** - * @brief 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)); - - /* Set the Region number */ - MPU->RNR = MPU_Init->Number; - - if ((MPU_Init->Enable) != RESET) - { - /* Check the parameters */ - 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)); - - 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); - } - else - { - MPU->RBAR = 0x00U; - MPU->RASR = 0x00U; - } -} -#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 (stm32f4xxxx.h)) - * @param PriorityGroup the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). - * @param pSubPriority Pointer on the Subpriority value (starting from 0). - * @retval None - */ -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - /* Get priority for Cortex-M system or device specific interrupts */ - NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); -} - -/** - * @brief Sets Pending bit of an external interrupt. - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Set interrupt pending */ - NVIC_SetPendingIRQ(IRQn); -} - -/** - * @brief Gets Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if pending else 0 */ - return NVIC_GetPendingIRQ(IRQn); -} - -/** - * @brief Clears the pending bit of an external interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Clear pending interrupt */ - NVIC_ClearPendingIRQ(IRQn); -} - -/** - * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if active else 0 */ - return NVIC_GetActive(IRQn); -} - -/** - * @brief Configures the SysTick clock source. - * @param CLKSource specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); - if (CLKSource == SYSTICK_CLKSOURCE_HCLK) - { - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } - else - { - SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; - } -} - -/** - * @brief This function handles SYSTICK interrupt request. - * @retval None - */ -void HAL_SYSTICK_IRQHandler(void) -{ - HAL_SYSTICK_Callback(); -} - -/** - * @brief SYSTICK callback. - * @retval None - */ -__weak void HAL_SYSTICK_Callback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SYSTICK_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CORTEX_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.c + * @author MCD Application Team + * @brief CORTEX HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the CORTEX: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + + [..] + *** How to configure Interrupts using CORTEX HAL driver *** + =========================================================== + [..] + This section provides functions allowing to configure the NVIC interrupts (IRQ). + The Cortex-M4 exceptions are managed by CMSIS functions. + + (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() + function according to the following table. + (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). + (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). + (#) please refer to programming manual for details in how to configure priority. + + -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. + The pending IRQ priority will be managed only by the sub priority. + + -@- IRQ priority order (sorted by highest to lowest priority): + (+@) Lowest preemption priority + (+@) Lowest sub priority + (+@) Lowest hardware priority (IRQ number) + + [..] + *** How to configure Systick using CORTEX HAL driver *** + ======================================================== + [..] + Setup SysTick Timer for time base. + + (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which + is a CMSIS function that: + (++) Configures the SysTick Reload register with value passed as function parameter. + (++) Configures the SysTick IRQ priority to the lowest value 0x0F. + (++) Resets the SysTick Counter register. + (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). + (++) Enables the SysTick Interrupt. + (++) Starts the SysTick Counter. + + (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro + __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the + HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined + inside the stm32f4xx_hal_cortex.h file. + + (+) You can change the SysTick IRQ priority by calling the + HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function + call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. + + (+) To adjust the SysTick time base, use the following formula: + + Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) + (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function + (++) Reload Value should not exceed 0xFFFFFF + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup CORTEX CORTEX + * @brief CORTEX HAL module driver + * @{ + */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions + * @{ + */ + + +/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] + This section provides the CORTEX HAL driver functions allowing to configure Interrupts + Systick functionalities + +@endverbatim + * @{ + */ + + +/** + * @brief Sets the priority grouping field (preemption priority and subpriority) + * using the required unlock sequence. + * @param PriorityGroup The priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. + * The pending IRQ priority will be managed only by the subpriority. + * @retval None + */ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); +} + +/** + * @brief Sets the priority of an interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @param PreemptPriority The preemption priority for the IRQn channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority + * @param SubPriority the subpriority level for the IRQ channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority. + * @retval None + */ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t prioritygroup = 0x00U; + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); +} + +/** + * @brief Enables a device specific interrupt in the NVIC interrupt controller. + * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + * function should be called before. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); +} + +/** + * @brief Disables a device specific interrupt in the NVIC interrupt controller. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Disable interrupt */ + NVIC_DisableIRQ(IRQn); +} + +/** + * @brief Initiates a system reset request to reset the MCU. + * @retval None + */ +void HAL_NVIC_SystemReset(void) +{ + /* System Reset */ + NVIC_SystemReset(); +} + +/** + * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. + * Counter is in free running mode to generate periodic interrupts. + * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. + * @retval status: - 0 Function succeeded. + * - 1 Function failed. + */ +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) +{ + return SysTick_Config(TicksNumb); +} +/** + * @} + */ + +/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions + * @brief Cortex control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the CORTEX + (NVIC, SYSTICK, MPU) functionalities. + + +@endverbatim + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** + * @brief Disables the MPU + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + +/** + * @brief Enable the MPU. + * @param MPU_Control Specifies the control mode of the MPU during hard fault, + * NMI, FAULTMASK and privileged access to the default memory + * This parameter can be one of the following values: + * @arg MPU_HFNMI_PRIVDEF_NONE + * @arg MPU_HARDFAULT_NMI + * @arg MPU_PRIVILEGED_DEFAULT + * @arg MPU_HFNMI_PRIVDEF + * @retval None + */ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + +/** + * @brief 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)); + + /* Set the Region number */ + MPU->RNR = MPU_Init->Number; + + if ((MPU_Init->Enable) != RESET) + { + /* Check the parameters */ + 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)); + + 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); + } + else + { + MPU->RBAR = 0x00U; + MPU->RASR = 0x00U; + } +} +#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 (stm32f4xxxx.h)) + * @param PriorityGroup the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). + * @param pSubPriority Pointer on the Subpriority value (starting from 0). + * @retval None + */ +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + /* Get priority for Cortex-M system or device specific interrupts */ + NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); +} + +/** + * @brief Sets Pending bit of an external interrupt. + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Set interrupt pending */ + NVIC_SetPendingIRQ(IRQn); +} + +/** + * @brief Gets Pending Interrupt (reads the pending register in the NVIC + * and returns the pending bit for the specified interrupt). + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if pending else 0 */ + return NVIC_GetPendingIRQ(IRQn); +} + +/** + * @brief Clears the pending bit of an external interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Clear pending interrupt */ + NVIC_ClearPendingIRQ(IRQn); +} + +/** + * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if active else 0 */ + return NVIC_GetActive(IRQn); +} + +/** + * @brief Configures the SysTick clock source. + * @param CLKSource specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + { + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } + else + { + SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + } +} + +/** + * @brief This function handles SYSTICK interrupt request. + * @retval None + */ +void HAL_SYSTICK_IRQHandler(void) +{ + HAL_SYSTICK_Callback(); +} + +/** + * @brief SYSTICK callback. + * @retval None + */ +__weak void HAL_SYSTICK_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_SYSTICK_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CORTEX_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c index 281f9c20..69d848f3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c @@ -1,1305 +1,1305 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.c - * @author MCD Application Team - * @brief DMA HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access (DMA) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and errors functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable and configure the peripheral to be connected to the DMA Stream - (except for internal SRAM/FLASH memories: no initialization is - necessary) please refer to Reference manual for connection between peripherals - and DMA requests. - - (#) For a given Stream, program the required configuration through the following parameters: - Transfer Direction, Source and Destination data formats, - Circular, Normal or peripheral flow control mode, Stream Priority level, - Source and Destination Increment mode, FIFO mode and its Threshold (if needed), - Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. - - -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: - __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). - - *** Polling mode IO operation *** - ================================= - [..] - (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source - address and destination address and the Length of data to be transferred. - (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this - case a fixed Timeout can be configured by User depending from his application. - (+) Use HAL_DMA_Abort() function to abort the current transfer. - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() - (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() - (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of - Source address and destination address and the Length of data to be transferred. In this - case the DMA interrupt is configured - (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine - (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback and - XferErrorCallback (i.e a member of DMA handle structure). - [..] - (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error - detection. - - (#) Use HAL_DMA_Abort_IT() function to abort the current transfer - - -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. - - -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - Half-Word data size for the peripheral to access its data register and set Word data size - for the Memory to gain in access time. Each two half words will be packed and written in - a single access to a Word in the Memory). - - -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - and Destination. In this case the Peripheral Data Size will be applied to both Source - and Destination. - - *** DMA HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA HAL driver. - - (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. - (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. - (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. - - [..] - (@) You can refer to the DMA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA DMA - * @brief DMA HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register */ - __IO uint32_t Reserved0; - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ -} DMA_Base_Registers; - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Constants - * @{ - */ - #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Functions - * @{ - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Exported_Functions - * @{ - */ - -/** @addtogroup DMA_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Stream priority value. - [..] - The HAL_DMA_Init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA according to the specified - * parameters in the DMA_InitTypeDef and create the associated handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0U; - uint32_t tickstart = HAL_GetTick(); - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); - assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); - assert_param(IS_DMA_MODE(hdma->Init.Mode)); - assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); - /* Check the memory burst, peripheral burst and FIFO threshold parameters only - when FIFO mode is enabled */ - if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) - { - assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); - } - - /* Allocate lock resource */ - __HAL_UNLOCK(hdma); - - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Get the CR register value */ - tmp = hdma->Instance->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ - tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); - - /* Prepare the DMA Stream configuration */ - tmp |= hdma->Init.Channel | hdma->Init.Direction | - hdma->Init.PeriphInc | hdma->Init.MemInc | - hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | - hdma->Init.Mode | hdma->Init.Priority; - - /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get memory burst and peripheral burst */ - tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; - } - - /* Write to DMA Stream CR register */ - hdma->Instance->CR = tmp; - - /* Get the FCR register value */ - tmp = hdma->Instance->FCR; - - /* Clear Direct mode and FIFO threshold bits */ - tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Prepare the DMA Stream FIFO configuration */ - tmp |= hdma->Init.FIFOMode; - - /* The FIFO threshold is not used when the FIFO mode is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get the FIFO threshold */ - tmp |= hdma->Init.FIFOThreshold; - - /* Check compatibility between FIFO threshold level and size of the memory burst */ - /* for INCR4, INCR8, INCR16 bursts */ - if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) - { - if (DMA_CheckFifoParam(hdma) != HAL_OK) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - } - - /* Write to DMA Stream FCR */ - hdma->Instance->FCR = tmp; - - /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate - DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clear all interrupt flags */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Initialize the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the DMA peripheral - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) -{ - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the DMA peripheral state */ - if(hdma->State == HAL_DMA_STATE_BUSY) - { - /* Return error status */ - return HAL_BUSY; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - - /* Disable the selected DMA Streamx */ - __HAL_DMA_DISABLE(hdma); - - /* Reset DMA Streamx control register */ - hdma->Instance->CR = 0U; - - /* Reset DMA Streamx number of data to transfer register */ - hdma->Instance->NDTR = 0U; - - /* Reset DMA Streamx peripheral address register */ - hdma->Instance->PAR = 0U; - - /* Reset DMA Streamx memory 0 address register */ - hdma->Instance->M0AR = 0U; - - /* Reset DMA Streamx memory 1 address register */ - hdma->Instance->M1AR = 0U; - - /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = 0x00000021U; - - /* Get DMA steam Base Address */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clean all callbacks */ - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Reset the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Reset the DMA state */ - hdma->State = HAL_DMA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group2 - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Starts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Start the DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - - if(hdma->XferHalfCpltCallback != NULL) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - - return status; -} - -/** - * @brief Aborts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * - * @note After disabling a DMA Stream, a check for wait until the DMA Stream is - * effectively disabled is added. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) -{ - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - uint32_t tickstart = HAL_GetTick(); - - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - else - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state*/ - hdma->State = HAL_DMA_STATE_READY; - } - return HAL_OK; -} - -/** - * @brief Aborts the DMA Transfer in Interrupt mode. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) -{ - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - return HAL_ERROR; - } - else - { - /* Set Abort State */ - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - } - - return HAL_OK; -} - -/** - * @brief Polling for transfer complete. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CompleteLevel Specifies the DMA level complete. - * @note The polling mode is kept in this version for legacy. it is recommanded to use the IT model instead. - * This model could be used for debug purpose. - * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t mask_cpltlevel; - uint32_t tickstart = HAL_GetTick(); - uint32_t tmpisr; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs; - - if(HAL_DMA_STATE_BUSY != hdma->State) - { - /* No transfer ongoing */ - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - __HAL_UNLOCK(hdma); - return HAL_ERROR; - } - - /* Polling mode not supported in circular mode and double buffering mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - } - else - { - /* Half Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - } - - regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - tmpisr = regs->ISR; - - while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) - { - /* Check for the Timeout (Not applicable in circular mode)*/ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_TIMEOUT; - } - } - - /* Get the ISR register value */ - tmpisr = regs->ISR; - - if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - - /* Clear the Direct Mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - } - } - - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - HAL_DMA_Abort(hdma); - - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State= HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - hdma->State = HAL_DMA_STATE_READY; - } - else - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; - } - - return status; -} - -/** - * @brief Handles DMA interrupt request. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) -{ - uint32_t tmpisr; - __IO uint32_t count = 0U; - uint32_t timeout = SystemCoreClock / 9600U; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - tmpisr = regs->ISR; - - /* Transfer Error Interrupt management ***************************************/ - if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) - { - /* Disable the transfer error interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TE); - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - } - } - /* FIFO Error Interrupt management ******************************************/ - if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) - { - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - } - } - /* Direct Mode Error Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) - { - /* Clear the direct mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - } - } - /* Half Transfer Complete Interrupt management ******************************/ - if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) - { - /* Clear the half transfer complete flag */ - regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - - /* Multi_Buffering mode enabled */ - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferM1HalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferM1HalfCpltCallback(hdma); - } - } - } - else - { - /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the half transfer interrupt */ - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - } - } - /* Transfer Complete Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) - { - /* Clear the transfer complete flag */ - regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - - if(HAL_DMA_STATE_ABORT == hdma->State) - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - if(hdma->XferAbortCallback != NULL) - { - hdma->XferAbortCallback(hdma); - } - return; - } - - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferM1CpltCallback != NULL) - { - /* Transfer complete Callback for memory1 */ - hdma->XferM1CpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete Callback for memory0 */ - hdma->XferCpltCallback(hdma); - } - } - } - /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ - else - { - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the transfer complete interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TC); - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - } - - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete callback */ - hdma->XferCpltCallback(hdma); - } - } - } - } - - /* manage error case */ - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - do - { - if (++count > timeout) - { - break; - } - } - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - } - - if(hdma->XferErrorCallback != NULL) - { - /* Transfer error callback */ - hdma->XferErrorCallback(hdma); - } - } -} - -/** - * @brief Register callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifer - * a DMA_HandleTypeDef structure as parameter. - * @param pCallback pointer to private callbacsk function which has pointer to - * a DMA_HandleTypeDef structure as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) -{ - - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = pCallback; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = pCallback; - break; - - default: - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @brief UnRegister callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifer - * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = NULL; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = NULL; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = NULL; - break; - - case HAL_DMA_XFER_ALL_CB_ID: - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - break; - - default: - status = HAL_ERROR; - break; - } - } - else - { - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group3 - * -@verbatim - =============================================================================== - ##### State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - * @brief Returns the DMA state. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL state - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) -{ - return hdma->State; -} - -/** - * @brief Return the DMA error code - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval DMA Error Code - */ -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) -{ - return hdma->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Sets the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Clear DBM bit */ - hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); - - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Memory to Peripheral */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Peripheral to Memory */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @brief Returns the DMA Stream base address depending on stream number - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval Stream base address - */ -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) -{ - uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; - - /* lookup table for necessary bitshift of flags within status registers */ - static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; - hdma->StreamIndex = flagBitshiftOffset[stream_number]; - - if (stream_number > 3U) - { - /* return pointer to HISR and HIFCR */ - hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); - } - else - { - /* return pointer to LISR and LIFCR */ - hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); - } - - return hdma->StreamBaseAddress; -} - -/** - * @brief Check compatibility between FIFO threshold level and size of the memory burst - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmp = hdma->Init.FIFOThreshold; - - /* Memory Data size equal to Byte */ - if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; - } - } - - /* Memory Data size equal to Half-Word */ - else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - /* Memory Data size equal to Word */ - else - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - return status; -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma.c + * @author MCD Application Team + * @brief DMA HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the Direct Memory Access (DMA) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State and errors functions + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable and configure the peripheral to be connected to the DMA Stream + (except for internal SRAM/FLASH memories: no initialization is + necessary) please refer to Reference manual for connection between peripherals + and DMA requests. + + (#) For a given Stream, program the required configuration through the following parameters: + Transfer Direction, Source and Destination data formats, + Circular, Normal or peripheral flow control mode, Stream Priority level, + Source and Destination Increment mode, FIFO mode and its Threshold (if needed), + Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. + + -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: + __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). + + *** Polling mode IO operation *** + ================================= + [..] + (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source + address and destination address and the Length of data to be transferred. + (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this + case a fixed Timeout can be configured by User depending from his application. + (+) Use HAL_DMA_Abort() function to abort the current transfer. + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() + (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() + (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of + Source address and destination address and the Length of data to be transferred. In this + case the DMA interrupt is configured + (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine + (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can + add his own function by customization of function pointer XferCpltCallback and + XferErrorCallback (i.e a member of DMA handle structure). + [..] + (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error + detection. + + (#) Use HAL_DMA_Abort_IT() function to abort the current transfer + + -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. + + -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is + possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set + Half-Word data size for the peripheral to access its data register and set Word data size + for the Memory to gain in access time. Each two half words will be packed and written in + a single access to a Word in the Memory). + + -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source + and Destination. In this case the Peripheral Data Size will be applied to both Source + and Destination. + + *** DMA HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in DMA HAL driver. + + (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. + (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. + (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. + + [..] + (@) You can refer to the DMA HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + __IO uint32_t ISR; /*!< DMA interrupt status register */ + __IO uint32_t Reserved0; + __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ +} DMA_Base_Registers; + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Constants + * @{ + */ + #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Functions + * @{ + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize the DMA Stream source + and destination addresses, incrementation and data sizes, transfer direction, + circular/normal mode selection, memory-to-memory mode selection and Stream priority value. + [..] + The HAL_DMA_Init() function follows the DMA configuration procedures as described in + reference manual. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the DMA according to the specified + * parameters in the DMA_InitTypeDef and create the associated handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + uint32_t tickstart = HAL_GetTick(); + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); + assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); + /* Check the memory burst, peripheral burst and FIFO threshold parameters only + when FIFO mode is enabled */ + if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) + { + assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); + assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); + assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); + } + + /* Allocate lock resource */ + __HAL_UNLOCK(hdma); + + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Get the CR register value */ + tmp = hdma->Instance->CR; + + /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ + tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ + DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ + DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ + DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); + + /* Prepare the DMA Stream configuration */ + tmp |= hdma->Init.Channel | hdma->Init.Direction | + hdma->Init.PeriphInc | hdma->Init.MemInc | + hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + hdma->Init.Mode | hdma->Init.Priority; + + /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get memory burst and peripheral burst */ + tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; + } + + /* Write to DMA Stream CR register */ + hdma->Instance->CR = tmp; + + /* Get the FCR register value */ + tmp = hdma->Instance->FCR; + + /* Clear Direct mode and FIFO threshold bits */ + tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); + + /* Prepare the DMA Stream FIFO configuration */ + tmp |= hdma->Init.FIFOMode; + + /* The FIFO threshold is not used when the FIFO mode is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get the FIFO threshold */ + tmp |= hdma->Init.FIFOThreshold; + + /* Check compatibility between FIFO threshold level and size of the memory burst */ + /* for INCR4, INCR8, INCR16 bursts */ + if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) + { + if (DMA_CheckFifoParam(hdma) != HAL_OK) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_ERROR; + } + } + } + + /* Write to DMA Stream FCR */ + hdma->Instance->FCR = tmp; + + /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate + DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clear all interrupt flags */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the DMA peripheral + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the DMA peripheral state */ + if(hdma->State == HAL_DMA_STATE_BUSY) + { + /* Return error status */ + return HAL_BUSY; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + + /* Disable the selected DMA Streamx */ + __HAL_DMA_DISABLE(hdma); + + /* Reset DMA Streamx control register */ + hdma->Instance->CR = 0U; + + /* Reset DMA Streamx number of data to transfer register */ + hdma->Instance->NDTR = 0U; + + /* Reset DMA Streamx peripheral address register */ + hdma->Instance->PAR = 0U; + + /* Reset DMA Streamx memory 0 address register */ + hdma->Instance->M0AR = 0U; + + /* Reset DMA Streamx memory 1 address register */ + hdma->Instance->M1AR = 0U; + + /* Reset DMA Streamx FIFO control register */ + hdma->Instance->FCR = 0x00000021U; + + /* Get DMA steam Base Address */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clean all callbacks */ + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Reset the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Reset the DMA state */ + hdma->State = HAL_DMA_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group2 + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and Start DMA transfer + (+) Configure the source, destination address and data length and + Start DMA transfer with interrupt + (+) Abort DMA transfer + (+) Poll for transfer complete + (+) Handle DMA interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Starts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Start the DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + + if(hdma->XferHalfCpltCallback != NULL) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + + return status; +} + +/** + * @brief Aborts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * + * @note After disabling a DMA Stream, a check for wait until the DMA Stream is + * effectively disabled is added. If a Stream is disabled + * while a data transfer is ongoing, the current data will be transferred + * and the Stream will be effectively disabled only after the transfer of + * this single data is finished. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + uint32_t tickstart = HAL_GetTick(); + + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + else + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + } + return HAL_OK; +} + +/** + * @brief Aborts the DMA Transfer in Interrupt mode. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) +{ + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + return HAL_ERROR; + } + else + { + /* Set Abort State */ + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + } + + return HAL_OK; +} + +/** + * @brief Polling for transfer complete. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CompleteLevel Specifies the DMA level complete. + * @note The polling mode is kept in this version for legacy. it is recommanded to use the IT model instead. + * This model could be used for debug purpose. + * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t mask_cpltlevel; + uint32_t tickstart = HAL_GetTick(); + uint32_t tmpisr; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* No transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + __HAL_UNLOCK(hdma); + return HAL_ERROR; + } + + /* Polling mode not supported in circular mode and double buffering mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + } + else + { + /* Half Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + } + + regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + tmpisr = regs->ISR; + + while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) + { + /* Check for the Timeout (Not applicable in circular mode)*/ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_TIMEOUT; + } + } + + /* Get the ISR register value */ + tmpisr = regs->ISR; + + if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + + /* Clear the Direct Mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + } + } + + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + HAL_DMA_Abort(hdma); + + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State= HAL_DMA_STATE_READY; + + return HAL_ERROR; + } + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + hdma->State = HAL_DMA_STATE_READY; + } + else + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; + } + + return status; +} + +/** + * @brief Handles DMA interrupt request. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval None + */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + uint32_t tmpisr; + __IO uint32_t count = 0U; + uint32_t timeout = SystemCoreClock / 9600U; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + tmpisr = regs->ISR; + + /* Transfer Error Interrupt management ***************************************/ + if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) + { + /* Disable the transfer error interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TE); + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + } + } + /* FIFO Error Interrupt management ******************************************/ + if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) + { + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + } + } + /* Direct Mode Error Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) + { + /* Clear the direct mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + } + } + /* Half Transfer Complete Interrupt management ******************************/ + if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) + { + /* Clear the half transfer complete flag */ + regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + + /* Multi_Buffering mode enabled */ + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferM1HalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferM1HalfCpltCallback(hdma); + } + } + } + else + { + /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the half transfer interrupt */ + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + } + } + /* Transfer Complete Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) + { + /* Clear the transfer complete flag */ + regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + + if(HAL_DMA_STATE_ABORT == hdma->State) + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + if(hdma->XferAbortCallback != NULL) + { + hdma->XferAbortCallback(hdma); + } + return; + } + + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferM1CpltCallback != NULL) + { + /* Transfer complete Callback for memory1 */ + hdma->XferM1CpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete Callback for memory0 */ + hdma->XferCpltCallback(hdma); + } + } + } + /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ + else + { + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the transfer complete interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TC); + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete callback */ + hdma->XferCpltCallback(hdma); + } + } + } + } + + /* manage error case */ + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + do + { + if (++count > timeout) + { + break; + } + } + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + + if(hdma->XferErrorCallback != NULL) + { + /* Transfer error callback */ + hdma->XferErrorCallback(hdma); + } + } +} + +/** + * @brief Register callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a DMA_HandleTypeDef structure as parameter. + * @param pCallback pointer to private callbacsk function which has pointer to + * a DMA_HandleTypeDef structure as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) +{ + + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = pCallback; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = pCallback; + break; + + default: + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @brief UnRegister callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = NULL; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = NULL; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = NULL; + break; + + case HAL_DMA_XFER_ALL_CB_ID: + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group3 + * +@verbatim + =============================================================================== + ##### State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Check the DMA state + (+) Get error code + +@endverbatim + * @{ + */ + +/** + * @brief Returns the DMA state. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL state + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) +{ + return hdma->State; +} + +/** + * @brief Return the DMA error code + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval DMA Error Code + */ +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) +{ + return hdma->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Sets the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Clear DBM bit */ + hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); + + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Memory to Peripheral */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Peripheral to Memory */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @brief Returns the DMA Stream base address depending on stream number + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval Stream base address + */ +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) +{ + uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; + + /* lookup table for necessary bitshift of flags within status registers */ + static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; + hdma->StreamIndex = flagBitshiftOffset[stream_number]; + + if (stream_number > 3U) + { + /* return pointer to HISR and HIFCR */ + hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); + } + else + { + /* return pointer to LISR and LIFCR */ + hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); + } + + return hdma->StreamBaseAddress; +} + +/** + * @brief Check compatibility between FIFO threshold level and size of the memory burst + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmp = hdma->Init.FIFOThreshold; + + /* Memory Data size equal to Byte */ + if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + break; + default: + break; + } + } + + /* Memory Data size equal to Half-Word */ + else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + /* Memory Data size equal to Word */ + else + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_HALFFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_FULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + return status; +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c index bfcc1fd0..6e073768 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c @@ -1,315 +1,315 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.c - * @author MCD Application Team - * @brief DMA Extension HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the DMA Extension peripheral: - * + Extended features functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DMA Extension HAL driver can be used as follows: - (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function - for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. - - -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. - -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. - -@- In Multi (Double) buffer mode, it is possible to update the base address for - the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMAEx DMAEx - * @brief DMA Extended HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private Constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMAEx_Private_Functions - * @{ - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ - -/** @addtogroup DMAEx_Exported_Functions - * @{ - */ - - -/** @addtogroup DMAEx_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer with interrupt - (+) Change on the fly the memory0 or memory1 address. - -@endverbatim - * @{ - */ - - -/** - * @brief Starts the multi_buffer DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - status = HAL_ERROR; - } - else - { - /* Process Locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Enable the double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Return error status */ - status = HAL_BUSY; - } - } - return status; -} - -/** - * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Check callback functions */ - if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) - { - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Enable the Double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all flags */ - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - hdma->Instance->FCR |= DMA_IT_FE; - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Change the memory0 or memory1 address on the fly. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param Address The new address - * @param memory the memory to be changed, This parameter can be one of - * the following values: - * MEMORY0 / - * MEMORY1 - * @note The MEMORY0 address can be changed only when the current transfer use - * MEMORY1 and the MEMORY1 address can be changed only when the current - * transfer use MEMORY0. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) -{ - if(memory == MEMORY0) - { - /* change the memory0 address */ - hdma->Instance->M0AR = Address; - } - else - { - /* change the memory1 address */ - hdma->Instance->M1AR = Address; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMAEx_Private_Functions - * @{ - */ - -/** - * @brief Set the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Peripheral to Memory */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Memory to Peripheral */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.c + * @author MCD Application Team + * @brief DMA Extension HAL module driver + * This file provides firmware functions to manage the following + * functionalities of the DMA Extension peripheral: + * + Extended features functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The DMA Extension HAL driver can be used as follows: + (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function + for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. + + -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. + -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. + -@- In Multi (Double) buffer mode, it is possible to update the base address for + the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMAEx DMAEx + * @brief DMA Extended HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private Constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMAEx_Private_Functions + * @{ + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ + +/** @addtogroup DMAEx_Exported_Functions + * @{ + */ + + +/** @addtogroup DMAEx_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer with interrupt + (+) Change on the fly the memory0 or memory1 address. + +@endverbatim + * @{ + */ + + +/** + * @brief Starts the multi_buffer DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + status = HAL_ERROR; + } + else + { + /* Process Locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Enable the double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Return error status */ + status = HAL_BUSY; + } + } + return status; +} + +/** + * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Check callback functions */ + if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) + { + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Enable the Double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all flags */ + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + hdma->Instance->FCR |= DMA_IT_FE; + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Change the memory0 or memory1 address on the fly. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param Address The new address + * @param memory the memory to be changed, This parameter can be one of + * the following values: + * MEMORY0 / + * MEMORY1 + * @note The MEMORY0 address can be changed only when the current transfer use + * MEMORY1 and the MEMORY1 address can be changed only when the current + * transfer use MEMORY0. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) +{ + if(memory == MEMORY0) + { + /* change the memory0 address */ + hdma->Instance->M0AR = Address; + } + else + { + /* change the memory1 address */ + hdma->Instance->M1AR = Address; + } + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMAEx_Private_Functions + * @{ + */ + +/** + * @brief Set the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Peripheral to Memory */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Memory to Peripheral */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c index 6bed5d54..7cf3e092 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c @@ -1,559 +1,559 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.c - * @author MCD Application Team - * @brief EXTI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - @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_GetConfigLine(). - (++) 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_GetPending(). - - (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2018 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/** MISRA C:2012 deviation rule has been granted for following rule: - * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out - * of bounds [0,3] in following API : - * HAL_EXTI_SetConfigLine - * HAL_EXTI_GetConfigLine - * HAL_EXTI_ClearConfigLine - */ - -#ifdef HAL_EXTI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup EXTI_Exported_Functions - * @{ - */ - -/** @addtogroup EXTI_Exported_Functions_Group1 - * @brief Configuration functions - * -@verbatim - =============================================================================== - ##### Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Set configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on EXTI configuration to be set. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check parameters */ - assert_param(IS_EXTI_LINE(pExtiConfig->Line)); - assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - - /* Assign line number to handle */ - hexti->Line = pExtiConfig->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* Configure triggers for configurable lines */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - - /* Configure rising trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) - { - EXTI->RTSR |= maskline; - } - else - { - EXTI->RTSR &= ~maskline; - } - - /* Configure falling trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) - { - EXTI->FTSR |= maskline; - } - else - { - EXTI->FTSR &= ~maskline; - } - - - /* Configure gpio port selection in case of gpio exti line */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - /* Configure interrupt mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) - { - EXTI->IMR |= maskline; - } - else - { - EXTI->IMR &= ~maskline; - } - - /* Configure event mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) - { - EXTI->EMR |= maskline; - } - else - { - EXTI->EMR &= ~maskline; - } - - return HAL_OK; -} - -/** - * @brief Get configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on structure to store Exti configuration. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* Store handle line number to configuration structure */ - pExtiConfig->Line = hexti->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Get core mode : interrupt */ - - /* Check if selected line is enable */ - if ((EXTI->IMR & maskline) != 0x00u) - { - pExtiConfig->Mode = EXTI_MODE_INTERRUPT; - } - else - { - pExtiConfig->Mode = EXTI_MODE_NONE; - } - - /* Get event mode */ - /* Check if selected line is enable */ - if ((EXTI->EMR & maskline) != 0x00u) - { - pExtiConfig->Mode |= EXTI_MODE_EVENT; - } - - /* 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; - } - else - { - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - } - - /* Get falling configuration */ - /* Check if configuration of selected line is enable */ - if ((EXTI->FTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; - } - - /* Get Gpio port selection for gpio lines */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); - } - else - { - pExtiConfig->GPIOSel = 0x00u; - } - } - else - { - /* No Trigger selected */ - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - pExtiConfig->GPIOSel = 0x00u; - } - - return HAL_OK; -} - -/** - * @brief Clear whole configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~maskline); - - /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~maskline); - - /* 3] Clear triggers in case of configurable lines */ - if ((hexti->Line & EXTI_CONFIG) != 0x00u) - { - EXTI->RTSR = (EXTI->RTSR & ~maskline); - EXTI->FTSR = (EXTI->FTSR & ~maskline); - - /* Get Gpio port selection for gpio lines */ - if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - return HAL_OK; -} - -/** - * @brief Register callback for a dedicated Exti line. - * @param hexti Exti handle. - * @param CallbackID User callback identifier. - * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. - * @param pPendingCbfn function pointer to be stored as callback. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) -{ - HAL_StatusTypeDef status = HAL_OK; - - switch (CallbackID) - { - case HAL_EXTI_COMMON_CB_ID: - hexti->PendingCallback = pPendingCbfn; - break; - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Store line number as handle private field. - * @param hexti Exti handle. - * @param ExtiLine Exti line number. - * This parameter can be from 0 to @ref EXTI_LINE_NB. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(ExtiLine)); - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - else - { - /* Store line number as handle private field */ - hexti->Line = ExtiLine; - - return HAL_OK; - } -} - -/** - * @} - */ - -/** @addtogroup EXTI_Exported_Functions_Group2 - * @brief EXTI IO functions. - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Handle EXTI interrupt request. - * @param hexti Exti handle. - * @retval none. - */ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t maskline; - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Get pending bit */ - regval = (EXTI->PR & maskline); - if (regval != 0x00u) - { - /* Clear pending bit */ - EXTI->PR = maskline; - - /* Call callback */ - if (hexti->PendingCallback != NULL) - { - hexti->PendingCallback(); - } - } -} - -/** - * @brief Get interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be checked. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval 1 if interrupt is pending else 0. - */ -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* return 1 if bit is set else 0 */ - regval = ((EXTI->PR & maskline) >> linepos); - return regval; -} - -/** - * @brief Clear interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be clear. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval None. - */ -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Clear Pending bit */ - EXTI->PR = maskline; -} - -/** - * @brief Generate a software interrupt for a dedicated line. - * @param hexti Exti handle. - * @retval None. - */ -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Generate Software interrupt */ - EXTI->SWIER = maskline; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_EXTI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.c + * @author MCD Application Team + * @brief EXTI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @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_GetConfigLine(). + (++) 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_GetPending(). + + (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ +/** MISRA C:2012 deviation rule has been granted for following rule: + * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out + * of bounds [0,3] in following API : + * HAL_EXTI_SetConfigLine + * HAL_EXTI_GetConfigLine + * HAL_EXTI_ClearConfigLine + */ + +#ifdef HAL_EXTI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup EXTI_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_Exported_Functions_Group1 + * @brief Configuration functions + * +@verbatim + =============================================================================== + ##### Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Set configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on EXTI configuration to be set. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check parameters */ + assert_param(IS_EXTI_LINE(pExtiConfig->Line)); + assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); + + /* Assign line number to handle */ + hexti->Line = pExtiConfig->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; + } + else + { + EXTI->IMR &= ~maskline; + } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + + return HAL_OK; +} + +/** + * @brief Get configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on structure to store Exti configuration. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* Store handle line number to configuration structure */ + pExtiConfig->Line = hexti->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) + { + pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + } + else + { + pExtiConfig->Mode = EXTI_MODE_NONE; + } + + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) + { + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 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; + } + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } + } + else + { + /* No Trigger selected */ + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; + } + + return HAL_OK; +} + +/** + * @brief Clear whole configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Clear interrupt mode */ + EXTI->IMR = (EXTI->IMR & ~maskline); + + /* 2] Clear event mode */ + EXTI->EMR = (EXTI->EMR & ~maskline); + + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + return HAL_OK; +} + +/** + * @brief Register callback for a dedicated Exti line. + * @param hexti Exti handle. + * @param CallbackID User callback identifier. + * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. + * @param pPendingCbfn function pointer to be stored as callback. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) +{ + HAL_StatusTypeDef status = HAL_OK; + + switch (CallbackID) + { + case HAL_EXTI_COMMON_CB_ID: + hexti->PendingCallback = pPendingCbfn; + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Store line number as handle private field. + * @param hexti Exti handle. + * @param ExtiLine Exti line number. + * This parameter can be from 0 to @ref EXTI_LINE_NB. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(ExtiLine)); + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + else + { + /* Store line number as handle private field */ + hexti->Line = ExtiLine; + + return HAL_OK; + } +} + +/** + * @} + */ + +/** @addtogroup EXTI_Exported_Functions_Group2 + * @brief EXTI IO functions. + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Handle EXTI interrupt request. + * @param hexti Exti handle. + * @retval none. + */ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Get pending bit */ + regval = (EXTI->PR & maskline); + if (regval != 0x00u) + { + /* Clear pending bit */ + EXTI->PR = maskline; + + /* Call callback */ + if (hexti->PendingCallback != NULL) + { + hexti->PendingCallback(); + } + } +} + +/** + * @brief Get interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be checked. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval 1 if interrupt is pending else 0. + */ +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* return 1 if bit is set else 0 */ + regval = ((EXTI->PR & maskline) >> linepos); + return regval; +} + +/** + * @brief Clear interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be clear. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval None. + */ +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Clear Pending bit */ + EXTI->PR = maskline; +} + +/** + * @brief Generate a software interrupt for a dedicated line. + * @param hexti Exti handle. + * @retval None. + */ +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) +{ + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_EXTI_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c index 28f651fe..69b47a6e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c @@ -1,778 +1,778 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.c - * @author MCD Application Team - * @brief FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the internal FLASH memory: - * + Program operations functions - * + Memory Control functions - * + Peripheral Errors functions - * - @verbatim - ============================================================================== - ##### FLASH peripheral features ##### - ============================================================================== - - [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses - to the Flash memory. It implements the erase and program Flash memory operations - and the read and write protection mechanisms. - - [..] The Flash memory interface accelerates code execution with a system of instruction - prefetch and cache lines. - - [..] The FLASH main features are: - (+) Flash memory read operations - (+) Flash memory program/erase operations - (+) Read / write protections - (+) Prefetch on I-Code - (+) 64 cache lines of 128 bits on I-Code - (+) 8 cache lines of 128 bits on D-Code - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver provides functions and macros to configure and program the FLASH - memory of all STM32F4xx devices. - - (#) FLASH Memory IO Programming functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Program functions: byte, half word, word and double word - (++) There Two modes of programming : - (+++) Polling mode using HAL_FLASH_Program() function - (+++) Interrupt mode using HAL_FLASH_Program_IT() function - - (#) Interrupts and flags management functions : - (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() - (++) Wait for last FLASH operation according to its status - (++) Get error flag status by calling HAL_SetErrorCode() - - [..] - In addition to these functions, this driver includes a set of macros allowing - to handle the following operations: - (+) Set the latency - (+) Enable/Disable the prefetch buffer - (+) Enable/Disable the Instruction cache and the Data cache - (+) Reset the Instruction cache and the Data cache - (+) Enable/Disable the FLASH interrupts - (+) Monitor the FLASH flags status - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH FLASH - * @brief FLASH HAL module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Variables - * @{ - */ -/* Variable used for Erase sectors under interruption */ -FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASH_Private_Functions - * @{ - */ -/* Program operations */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); -static void FLASH_Program_Word(uint32_t Address, uint32_t Data); -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); -static void FLASH_SetErrorCode(void); - -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Functions FLASH Exported Functions - * @{ - */ - -/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions - * @brief Programming operation functions - * -@verbatim - =============================================================================== - ##### Programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the FLASH - program operations. - -@endverbatim - * @{ - */ - -/** - * @brief Program byte, halfword, word or double word at a specified address - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL_StatusTypeDef HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; - pFlash.Address = Address; - - if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - return status; -} - -/** - * @brief This function handles FLASH interrupt request. - * @retval None - */ -void HAL_FLASH_IRQHandler(void) -{ - uint32_t addresstmp = 0U; - - /* Check FLASH operation error flags */ -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*return the faulty sector*/ - addresstmp = pFlash.Sector; - pFlash.Sector = 0xFFFFFFFFU; - } - else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /*return the faulty bank*/ - addresstmp = pFlash.Bank; - } - else - { - /*return the faulty address*/ - addresstmp = pFlash.Address; - } - - /*Save the Error code*/ - FLASH_SetErrorCode(); - - /* FLASH error interrupt user callback */ - HAL_FLASH_OperationErrorCallback(addresstmp); - - /*Stop the procedure ongoing*/ - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - - /* Check FLASH End of Operation flag */ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - - if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*Nb of sector to erased can be decreased*/ - pFlash.NbSectorsToErase--; - - /* Check if there are still sectors to erase*/ - if(pFlash.NbSectorsToErase != 0U) - { - addresstmp = pFlash.Sector; - /*Indicate user which sector has been erased*/ - HAL_FLASH_EndOfOperationCallback(addresstmp); - - /*Increment sector number*/ - pFlash.Sector++; - addresstmp = pFlash.Sector; - FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); - } - else - { - /*No more sectors to Erase, user callback can be called.*/ - /*Reset Sector and stop Erase sectors procedure*/ - pFlash.Sector = addresstmp = 0xFFFFFFFFU; - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches() ; - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(addresstmp); - } - } - else - { - if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /* MassErase ended. Return the selected bank */ - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches() ; - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Bank); - } - else - { - /*Program ended. Return the selected address*/ - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Address); - } - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - } - - if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) - { - /* Operation is completed, disable the PG, SER, SNB and MER Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); - - /* Disable End of FLASH Operation interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); - - /* Disable Error source interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - } -} - -/** - * @brief FLASH end of operation interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector which has been erased - * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_EndOfOperationCallback could be implemented in the user file - */ -} - -/** - * @brief FLASH operation error interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector number which returned an error - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_OperationErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the FLASH - memory operations. - -@endverbatim - * @{ - */ - -/** - * @brief Unlock the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Unlock(void) -{ - HAL_StatusTypeDef status = HAL_OK; - - if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - WRITE_REG(FLASH->KEYR, FLASH_KEY1); - WRITE_REG(FLASH->KEYR, FLASH_KEY2); - - /* Verify Flash is unlocked */ - if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - status = HAL_ERROR; - } - } - - return status; -} - -/** - * @brief Locks the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; - - return HAL_OK; -} - -/** - * @brief Unlock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) -{ - if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Lock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return HAL_OK; -} - -/** - * @brief Launch the option byte loading. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) -{ - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time Errors of the FLASH peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Get the specific FLASH error flag. - * @retval FLASH_ErrorCode: The returned value can be a combination of: - * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) - * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag - * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag - * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag - * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag - * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag - */ -uint32_t HAL_FLASH_GetError(void) -{ - return pFlash.ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Wait for a FLASH operation to complete. - * @param Timeout maximum flash operationtimeout - * @retval HAL Status - */ -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Clear Error Code */ - pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - } -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - /*Save the error code*/ - FLASH_SetErrorCode(); - return HAL_ERROR; - } - - /* If there is no error flag set */ - return HAL_OK; - -} - -/** - * @brief Program a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and Vpp in the range 7V to 9V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - /* Program first word */ - *(__IO uint32_t*)Address = (uint32_t)Data; - - /* Barrier to ensure programming is performed in 2 steps, in right order - (independently of compiler optimization behavior) */ - __ISB(); - - /* Program second word */ - *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); -} - - -/** - * @brief Program word (32-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Word(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t*)Address = Data; -} - -/** - * @brief Program a half-word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.1V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t*)Address = Data; -} - -/** - * @brief Program byte (8-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 1.8V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t*)Address = Data; -} - -/** - * @brief Set the specific FLASH error flag. - * @retval None - */ -static void FLASH_SetErrorCode(void) -{ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; - - /* Clear FLASH write protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; - - /* Clear FLASH Programming alignment error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; - - /* Clear FLASH Programming parallelism error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; - - /* Clear FLASH Programming sequence error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); - } -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; - - /* Clear FLASH Proprietary readout protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); - } -#endif /* FLASH_SR_RDERR */ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; - - /* Clear FLASH Operation error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.c + * @author MCD Application Team + * @brief FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * + Program operations functions + * + Memory Control functions + * + Peripheral Errors functions + * + @verbatim + ============================================================================== + ##### FLASH peripheral features ##### + ============================================================================== + + [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + to the Flash memory. It implements the erase and program Flash memory operations + and the read and write protection mechanisms. + + [..] The Flash memory interface accelerates code execution with a system of instruction + prefetch and cache lines. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) 64 cache lines of 128 bits on I-Code + (+) 8 cache lines of 128 bits on D-Code + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F4xx devices. + + (#) FLASH Memory IO Programming functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Program functions: byte, half word, word and double word + (++) There Two modes of programming : + (+++) Polling mode using HAL_FLASH_Program() function + (+++) Interrupt mode using HAL_FLASH_Program_IT() function + + (#) Interrupts and flags management functions : + (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() + (++) Wait for last FLASH operation according to its status + (++) Get error flag status by calling HAL_SetErrorCode() + + [..] + In addition to these functions, this driver includes a set of macros allowing + to handle the following operations: + (+) Set the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the Instruction cache and the Data cache + (+) Reset the Instruction cache and the Data cache + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variable used for Erase sectors under interruption */ +FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASH_Private_Functions + * @{ + */ +/* Program operations */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); +static void FLASH_Program_Word(uint32_t Address, uint32_t Data); +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); +static void FLASH_SetErrorCode(void); + +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + * @brief Programming operation functions + * +@verbatim + =============================================================================== + ##### Programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the FLASH + program operations. + +@endverbatim + * @{ + */ + +/** + * @brief Program byte, halfword, word or double word at a specified address + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + FLASH->CR &= (~FLASH_CR_PG); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; + pFlash.Address = Address; + + if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + return status; +} + +/** + * @brief This function handles FLASH interrupt request. + * @retval None + */ +void HAL_FLASH_IRQHandler(void) +{ + uint32_t addresstmp = 0U; + + /* Check FLASH operation error flags */ +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*return the faulty sector*/ + addresstmp = pFlash.Sector; + pFlash.Sector = 0xFFFFFFFFU; + } + else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /*return the faulty bank*/ + addresstmp = pFlash.Bank; + } + else + { + /*return the faulty address*/ + addresstmp = pFlash.Address; + } + + /*Save the Error code*/ + FLASH_SetErrorCode(); + + /* FLASH error interrupt user callback */ + HAL_FLASH_OperationErrorCallback(addresstmp); + + /*Stop the procedure ongoing*/ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + + /* Check FLASH End of Operation flag */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + + if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*Nb of sector to erased can be decreased*/ + pFlash.NbSectorsToErase--; + + /* Check if there are still sectors to erase*/ + if(pFlash.NbSectorsToErase != 0U) + { + addresstmp = pFlash.Sector; + /*Indicate user which sector has been erased*/ + HAL_FLASH_EndOfOperationCallback(addresstmp); + + /*Increment sector number*/ + pFlash.Sector++; + addresstmp = pFlash.Sector; + FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); + } + else + { + /*No more sectors to Erase, user callback can be called.*/ + /*Reset Sector and stop Erase sectors procedure*/ + pFlash.Sector = addresstmp = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches() ; + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + } + } + else + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* MassErase ended. Return the selected bank */ + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches() ; + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Bank); + } + else + { + /*Program ended. Return the selected address*/ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + + if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + { + /* Operation is completed, disable the PG, SER, SNB and MER Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); + + /* Disable End of FLASH Operation interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); + + /* Disable Error source interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + } +} + +/** + * @brief FLASH end of operation interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector which has been erased + * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_EndOfOperationCallback could be implemented in the user file + */ +} + +/** + * @brief FLASH operation error interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector number which returned an error + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_OperationErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + memory operations. + +@endverbatim + * @{ + */ + +/** + * @brief Unlock the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Unlock(void) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + /* Authorize the FLASH Registers access */ + WRITE_REG(FLASH->KEYR, FLASH_KEY1); + WRITE_REG(FLASH->KEYR, FLASH_KEY2); + + /* Verify Flash is unlocked */ + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + status = HAL_ERROR; + } + } + + return status; +} + +/** + * @brief Locks the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Lock(void) +{ + /* Set the LOCK Bit to lock the FLASH Registers access */ + FLASH->CR |= FLASH_CR_LOCK; + + return HAL_OK; +} + +/** + * @brief Unlock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) +{ + if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) + { + /* Authorizes the Option Byte register programming */ + FLASH->OPTKEYR = FLASH_OPT_KEY1; + FLASH->OPTKEYR = FLASH_OPT_KEY2; + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Lock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) +{ + /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ + FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; + + return HAL_OK; +} + +/** + * @brief Launch the option byte loading. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) +{ + /* Set the OPTSTRT bit in OPTCR register */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; + + /* Wait for last operation to be completed */ + return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief Peripheral Errors functions + * +@verbatim + =============================================================================== + ##### Peripheral Errors functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time Errors of the FLASH peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Get the specific FLASH error flag. + * @retval FLASH_ErrorCode: The returned value can be a combination of: + * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) + * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag + * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag + * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag + * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag + * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag + */ +uint32_t HAL_FLASH_GetError(void) +{ + return pFlash.ErrorCode; +} + +/** + * @} + */ + +/** + * @brief Wait for a FLASH operation to complete. + * @param Timeout maximum flash operationtimeout + * @retval HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) +{ + uint32_t tickstart = 0U; + + /* Clear Error Code */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + Even if the FLASH operation fails, the BUSY flag will be reset and an error + flag will be set */ + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) + { + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) + { + return HAL_TIMEOUT; + } + } + } + + /* Check FLASH End of Operation flag */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + } +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* If there is no error flag set */ + return HAL_OK; + +} + +/** + * @brief Program a double word (64-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V and Vpp in the range 7V to 9V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; + FLASH->CR |= FLASH_CR_PG; + + /* Program first word */ + *(__IO uint32_t*)Address = (uint32_t)Data; + + /* Barrier to ensure programming is performed in 2 steps, in right order + (independently of compiler optimization behavior) */ + __ISB(); + + /* Program second word */ + *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); +} + + +/** + * @brief Program word (32-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Word(uint32_t Address, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint32_t*)Address = Data; +} + +/** + * @brief Program a half-word (16-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.1V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_HALF_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint16_t*)Address = Data; +} + +/** + * @brief Program byte (8-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 1.8V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_BYTE; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint8_t*)Address = Data; +} + +/** + * @brief Set the specific FLASH error flag. + * @retval None + */ +static void FLASH_SetErrorCode(void) +{ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; + + /* Clear FLASH write protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; + + /* Clear FLASH Programming alignment error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; + + /* Clear FLASH Programming parallelism error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; + + /* Clear FLASH Programming sequence error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); + } +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; + + /* Clear FLASH Proprietary readout protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); + } +#endif /* FLASH_SR_RDERR */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; + + /* Clear FLASH Operation error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c index b97cb0c2..066aa502 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c @@ -1,1350 +1,1350 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.c - * @author MCD Application Team - * @brief Extended FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the FLASH extension peripheral: - * + Extended programming operations functions - * - @verbatim - ============================================================================== - ##### Flash Extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and - STM32F429xx/439xx devices contains the following additional features - - (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write - capability (RWW) - (+) Dual bank memory organization - (+) PCROP protection for all banks - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the FLASH memory - of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx - devices. It includes - (#) FLASH Memory Erase functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Erase function: Erase sector, erase all sectors - (++) There are two modes of erase : - (+++) Polling Mode using HAL_FLASHEx_Erase() - (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() - - (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : - (++) Set/Reset the write protection - (++) Set the Read protection Level - (++) Set the BOR level - (++) Program the user Option Bytes - (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : - (++) Extended space (bank 2) erase function - (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) - (++) Dual Boot activation - (++) Write protection configuration for bank 2 - (++) PCROP protection configuration and control for both banks - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASHEx FLASHEx - * @brief FLASH HAL Extension module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Variables - * @{ - */ -extern FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Functions - * @{ - */ -/* Option bytes control */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); -static uint8_t FLASH_OB_GetUser(void); -static uint16_t FLASH_OB_GetWRP(void); -static uint8_t FLASH_OB_GetRDP(void); -static uint8_t FLASH_OB_GetBOR(void); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions - * @{ - */ - -/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions - * @brief Extended IO operation functions - * -@verbatim - =============================================================================== - ##### Extended programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the Extension FLASH - programming operations. - -@endverbatim - * @{ - */ -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors - * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @param[out] SectorError pointer to variable that - * contains the configuration information on faulty sector in case of error - * (0xFFFFFFFFU means that all the sectors have been correctly erased) - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) -{ - HAL_StatusTypeDef status = HAL_ERROR; - uint32_t index = 0U; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Initialization of SectorError variable*/ - *SectorError = 0xFFFFFFFFU; - - if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_MER_BIT); - } - else - { - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - /* Erase by sector by sector to be done*/ - for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) - { - FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the erase operation is completed, disable the SER and SNB Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); - - if(status != HAL_OK) - { - /* In case of error, stop erase procedure and return the faulty sector*/ - *SectorError = index; - break; - } - } - } - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled - * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR); - - if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; - pFlash.Bank = pEraseInit->Banks; - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - } - else - { - /* Erase by sector to be done*/ - - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; - pFlash.NbSectorsToErase = pEraseInit->NbSectors; - pFlash.Sector = pEraseInit->Sector; - pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; - - /*Erase 1st sector and wait for IT*/ - FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); - } - - return status; -} - -/** - * @brief Program option bytes - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); - - /*Write protection configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) - { - assert_param(IS_WRPSTATE(pOBInit->WRPState)); - if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ - status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - else - { - /*Disable of Write protection on the selected Sector*/ - status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - } - - /*Read protection configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) - { - status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); - } - - /*USER configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) - { - status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, - pOBInit->USERConfig&OB_STOP_NO_RST, - pOBInit->USERConfig&OB_STDBY_NO_RST); - } - - /*BOR Level configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) - { - status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Get the Option byte configuration - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) -{ - pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; - - /*Get WRP*/ - pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); - - /*Get RDP Level*/ - pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); - - /*Get USER*/ - pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); - - /*Get BOR Level*/ - pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Program option bytes - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Check the parameters */ - assert_param(IS_OBEX(pAdvOBInit->OptionType)); - - /*Program PCROP option byte*/ - if(((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) - { - /* Check the parameters */ - assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); - if((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - else - { - /*Disable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - } - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - /*Program BOOT config option byte*/ - if(((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) - { - status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); - } -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - return status; -} - -/** - * @brief Get the OBEX byte configuration - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /*Get Sector*/ - pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - /*Get Sector for Bank1*/ - pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); - - /*Get Sector for Bank2*/ - pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); - - /*Get Boot config OB*/ - pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ -} - -/** - * @brief Select the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); - - return HAL_OK; -} - -/** - * @brief Deselect the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); - - return HAL_OK; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ - STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Full erase of FLASH memory sectors - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* if the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - - if(Banks == FLASH_BANK_BOTH) - { - /* bank1 & bank2 will be erased*/ - FLASH->CR |= FLASH_MER_BIT; - } - else if(Banks == FLASH_BANK_1) - { - /*Only bank1 will be erased*/ - FLASH->CR |= FLASH_CR_MER1; - } - else - { - /*Only bank2 will be erased*/ - FLASH->CR |= FLASH_CR_MER2; - } - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ - if(Sector > FLASH_SECTOR_11) - { - Sector += 4U; - } - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_SECTOR_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL FLASH State - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if(WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - - /*Write protection on all sector of BANK2*/ - if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - } - - } - return status; -} - -/** - * @brief Disable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_Sector_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Disable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if(WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - - /*Write protection on all sector of BANK2*/ - if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - } - - } - - return status; -} - -/** - * @brief Configure the Dual Bank Boot. - * - * @note This function can be used only for STM32F42xxx/43xxx devices. - * - * @param BootConfig specifies the Dual Bank Boot Option byte. - * This parameter can be one of the following values: - * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable - * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled - * @retval None - */ -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_BOOT(BootConfig)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /* Set Dual Bank Boot */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; - } - - return status; -} - -/** - * @brief Enable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Enable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; - } - else - { - assert_param(IS_OB_PCROP(SectorBank2)); - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - - /*Write protection on all sector of BANK2*/ - if(Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - } - - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Disable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); - } - else - { - /*Write protection done on sectors of BANK2*/ - assert_param(IS_OB_PCROP(SectorBank2)); - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - - /*Write protection on all sector of BANK2*/ - if(Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - } - - } - - return status; - -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** - * @brief Mass erase of FLASH memory - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * - * @retval None - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* If the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - - return status; -} - -/** - * @brief Disable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} -#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~Sector); - } - - return status; - -} -#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -/** - * @brief Set the read protection level. - * @param Level specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - * - * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_RDP_LEVEL(Level)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = Level; - } - - return status; -} - -/** - * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param Iwdg Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param Stop Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NO_RST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param Stdby Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) -{ - uint8_t optiontmp = 0xFF; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(Iwdg)); - assert_param(IS_OB_STOP_SOURCE(Stop)); - assert_param(IS_OB_STDBY_SOURCE(Stdby)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); - } - - return status; -} - -/** - * @brief Set the BOR Level. - * @param Level specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR_LEVEL(Level)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; - - return HAL_OK; - -} - -/** - * @brief Return the FLASH User Option Byte value. - * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -static uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0)); -} - -/** - * @brief Return the FLASH Write Protection Option Bytes value. - * @retval uint16_t FLASH Write Protection Option Bytes value - */ -static uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @retval FLASH ReadOut Protection Status: - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - */ -static uint8_t FLASH_OB_GetRDP(void) -{ - uint8_t readstatus = OB_RDP_LEVEL_0; - - if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2)) - { - readstatus = OB_RDP_LEVEL_2; - } - else if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0)) - { - readstatus = OB_RDP_LEVEL_0; - } - else - { - readstatus = OB_RDP_LEVEL_1; - } - - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @retval uint8_t The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -static uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @brief Flush the instruction and data caches - * @retval None - */ -void FLASH_FlushCaches(void) -{ - /* Flush instruction cache */ - if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN)!= RESET) - { - /* Disable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); - /* Reset instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_RESET(); - /* Enable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - } - - /* Flush data cache */ - if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) - { - /* Disable data cache */ - __HAL_FLASH_DATA_CACHE_DISABLE(); - /* Reset data cache */ - __HAL_FLASH_DATA_CACHE_RESET(); - /* Enable data cache */ - __HAL_FLASH_DATA_CACHE_ENABLE(); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.c + * @author MCD Application Team + * @brief Extended FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the FLASH extension peripheral: + * + Extended programming operations functions + * + @verbatim + ============================================================================== + ##### Flash Extension features ##### + ============================================================================== + + [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and + STM32F429xx/439xx devices contains the following additional features + + (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write + capability (RWW) + (+) Dual bank memory organization + (+) PCROP protection for all banks + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx + devices. It includes + (#) FLASH Memory Erase functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Erase function: Erase sector, erase all sectors + (++) There are two modes of erase : + (+++) Polling Mode using HAL_FLASHEx_Erase() + (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() + + (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Set the BOR level + (++) Program the user Option Bytes + (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : + (++) Extended space (bank 2) erase function + (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) + (++) Dual Boot activation + (++) Write protection configuration for bank 2 + (++) PCROP protection configuration and control for both banks + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Variables + * @{ + */ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ +/* Option bytes control */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); +static uint8_t FLASH_OB_GetUser(void); +static uint16_t FLASH_OB_GetWRP(void); +static uint8_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetBOR(void); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions + * @brief Extended IO operation functions + * +@verbatim + =============================================================================== + ##### Extended programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the Extension FLASH + programming operations. + +@endverbatim + * @{ + */ +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] SectorError pointer to variable that + * contains the configuration information on faulty sector in case of error + * (0xFFFFFFFFU means that all the sectors have been correctly erased) + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) +{ + HAL_StatusTypeDef status = HAL_ERROR; + uint32_t index = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Initialization of SectorError variable*/ + *SectorError = 0xFFFFFFFFU; + + if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the erase operation is completed, disable the MER Bit */ + FLASH->CR &= (~FLASH_MER_BIT); + } + else + { + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + /* Erase by sector by sector to be done*/ + for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) + { + FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the SER and SNB Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); + + if(status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty sector*/ + *SectorError = index; + break; + } + } + } + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches(); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled + * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + /* Clear pending flags (if any) */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\ + FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR); + + if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + pFlash.Bank = pEraseInit->Banks; + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + } + else + { + /* Erase by sector to be done*/ + + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; + pFlash.NbSectorsToErase = pEraseInit->NbSectors; + pFlash.Sector = pEraseInit->Sector; + pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; + + /*Erase 1st sector and wait for IT*/ + FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); + } + + return status; +} + +/** + * @brief Program option bytes + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); + + /*Write protection configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) + { + assert_param(IS_WRPSTATE(pOBInit->WRPState)); + if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ + status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + else + { + /*Disable of Write protection on the selected Sector*/ + status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + } + + /*Read protection configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + { + status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + } + + /*USER configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + { + status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, + pOBInit->USERConfig&OB_STOP_NO_RST, + pOBInit->USERConfig&OB_STDBY_NO_RST); + } + + /*BOR Level configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) + { + status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Get the Option byte configuration + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) +{ + pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; + + /*Get WRP*/ + pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); + + /*Get RDP Level*/ + pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); + + /*Get USER*/ + pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); + + /*Get BOR Level*/ + pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Program option bytes + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_OBEX(pAdvOBInit->OptionType)); + + /*Program PCROP option byte*/ + if(((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) + { + /* Check the parameters */ + assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); + if((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + else + { + /*Disable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + } + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + /*Program BOOT config option byte*/ + if(((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) + { + status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); + } +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + return status; +} + +/** + * @brief Get the OBEX byte configuration + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /*Get Sector*/ + pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + /*Get Sector for Bank1*/ + pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); + + /*Get Sector for Bank2*/ + pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); + + /*Get Boot config OB*/ + pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ +} + +/** + * @brief Select the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) +{ + uint8_t optiontmp = 0xFF; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); + + return HAL_OK; +} + +/** + * @brief Deselect the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) +{ + uint8_t optiontmp = 0xFF; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); + + return HAL_OK; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ + STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. + * @retval The FLASH Write Protection Option Bytes value + */ +uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Full erase of FLASH memory sectors + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* if the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + + if(Banks == FLASH_BANK_BOTH) + { + /* bank1 & bank2 will be erased*/ + FLASH->CR |= FLASH_MER_BIT; + } + else if(Banks == FLASH_BANK_1) + { + /*Only bank1 will be erased*/ + FLASH->CR |= FLASH_CR_MER1; + } + else + { + /*Only bank2 will be erased*/ + FLASH->CR |= FLASH_CR_MER2; + } + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if(VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ + if(Sector > FLASH_SECTOR_11) + { + Sector += 4U; + } + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_SECTOR_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL FLASH State + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if(WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + + /*Write protection on all sector of BANK2*/ + if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + } + + } + return status; +} + +/** + * @brief Disable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_Sector_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Disable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if(WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + + /*Write protection on all sector of BANK2*/ + if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + } + + } + + return status; +} + +/** + * @brief Configure the Dual Bank Boot. + * + * @note This function can be used only for STM32F42xxx/43xxx devices. + * + * @param BootConfig specifies the Dual Bank Boot Option byte. + * This parameter can be one of the following values: + * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable + * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled + * @retval None + */ +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_BOOT(BootConfig)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Set Dual Bank Boot */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; + } + + return status; +} + +/** + * @brief Enable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Enable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; + } + else + { + assert_param(IS_OB_PCROP(SectorBank2)); + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + + /*Write protection on all sector of BANK2*/ + if(Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + } + + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Disable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); + } + else + { + /*Write protection done on sectors of BANK2*/ + assert_param(IS_OB_PCROP(SectorBank2)); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + + /*Write protection on all sector of BANK2*/ + if(Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + } + + } + + return status; + +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** + * @brief Mass erase of FLASH memory + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * + * @retval None + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* If the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_CR_MER; + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if(VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + + return status; +} + +/** + * @brief Disable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + + return status; +} +#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~Sector); + } + + return status; + +} +#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +/** + * @brief Set the read protection level. + * @param Level specifies the read protection level. + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + * + * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_RDP_LEVEL(Level)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = Level; + } + + return status; +} + +/** + * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @param Iwdg Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG selected + * @param Stop Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NO_RST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param Stdby Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) +{ + uint8_t optiontmp = 0xFF; + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(Iwdg)); + assert_param(IS_OB_STOP_SOURCE(Stop)); + assert_param(IS_OB_STDBY_SOURCE(Stdby)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); + + /* Update User Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); + } + + return status; +} + +/** + * @brief Set the BOR Level. + * @param Level specifies the Option Bytes BOR Reset Level. + * This parameter can be one of the following values: + * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) +{ + /* Check the parameters */ + assert_param(IS_OB_BOR_LEVEL(Level)); + + /* Set the BOR Level */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; + + return HAL_OK; + +} + +/** + * @brief Return the FLASH User Option Byte value. + * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +static uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return ((uint8_t)(FLASH->OPTCR & 0xE0)); +} + +/** + * @brief Return the FLASH Write Protection Option Bytes value. + * @retval uint16_t FLASH Write Protection Option Bytes value + */ +static uint16_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +} + +/** + * @brief Returns the FLASH Read Protection level. + * @retval FLASH ReadOut Protection Status: + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + */ +static uint8_t FLASH_OB_GetRDP(void) +{ + uint8_t readstatus = OB_RDP_LEVEL_0; + + if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2)) + { + readstatus = OB_RDP_LEVEL_2; + } + else if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0)) + { + readstatus = OB_RDP_LEVEL_0; + } + else + { + readstatus = OB_RDP_LEVEL_1; + } + + return readstatus; +} + +/** + * @brief Returns the FLASH BOR level. + * @retval uint8_t The FLASH BOR level: + * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V + */ +static uint8_t FLASH_OB_GetBOR(void) +{ + /* Return the FLASH BOR level */ + return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); +} + +/** + * @brief Flush the instruction and data caches + * @retval None + */ +void FLASH_FlushCaches(void) +{ + /* Flush instruction cache */ + if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN)!= RESET) + { + /* Disable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); + /* Reset instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_RESET(); + /* Enable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); + } + + /* Flush data cache */ + if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) + { + /* Disable data cache */ + __HAL_FLASH_DATA_CACHE_DISABLE(); + /* Reset data cache */ + __HAL_FLASH_DATA_CACHE_RESET(); + /* Enable data cache */ + __HAL_FLASH_DATA_CACHE_ENABLE(); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c index 1fb20ec7..12db458b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c @@ -1,175 +1,175 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.c - * @author MCD Application Team - * @brief FLASH RAMFUNC module driver. - * This file provides a FLASH firmware functions which should be - * executed from internal SRAM - * + Stop/Start the flash interface while System Run - * + Enable/Disable the flash sleep while System Run - @verbatim - ============================================================================== - ##### APIs executed from Internal RAM ##### - ============================================================================== - [..] - *** ARM Compiler *** - -------------------- - [..] RAM functions are defined using the toolchain options. - Functions that are be executed in RAM should reside in a separate - source module. Using the 'Options for File' dialog you can simply change - the 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - Options for Target' dialog. - - *** ICCARM Compiler *** - ----------------------- - [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". - - *** GNU Compiler *** - -------------------- - [..] RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC - * @brief FLASH functions executed from RAM - * @{ - */ -#ifdef HAL_FLASH_MODULE_ENABLED -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions - * @{ - */ - -/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### ramfunc functions ##### - =============================================================================== - [..] - This subsection provides a set of functions that should be executed from RAM - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Stop the flash interface while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Stop the flash interface while System Run */ - SET_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Start the flash interface while System Run - * @note This mode is only available for STM32F411xx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Start the flash interface while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Enable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode could n't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the flash sleep while System Run */ - SET_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @brief Disable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Disable the flash sleep while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#endif /* HAL_FLASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.c + * @author MCD Application Team + * @brief FLASH RAMFUNC module driver. + * This file provides a FLASH firmware functions which should be + * executed from internal SRAM + * + Stop/Start the flash interface while System Run + * + Enable/Disable the flash sleep while System Run + @verbatim + ============================================================================== + ##### APIs executed from Internal RAM ##### + ============================================================================== + [..] + *** ARM Compiler *** + -------------------- + [..] RAM functions are defined using the toolchain options. + Functions that are be executed in RAM should reside in a separate + source module. Using the 'Options for File' dialog you can simply change + the 'Code / Const' area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the + Options for Target' dialog. + + *** ICCARM Compiler *** + ----------------------- + [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". + + *** GNU Compiler *** + -------------------- + [..] RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC + * @brief FLASH functions executed from RAM + * @{ + */ +#ifdef HAL_FLASH_MODULE_ENABLED +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions + * @{ + */ + +/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### ramfunc functions ##### + =============================================================================== + [..] + This subsection provides a set of functions that should be executed from RAM + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Stop the flash interface while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Stop the flash interface while System Run */ + SET_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Start the flash interface while System Run + * @note This mode is only available for STM32F411xx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Start the flash interface while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Enable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode could n't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the flash sleep while System Run */ + SET_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @brief Disable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Disable the flash sleep while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#endif /* HAL_FLASH_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c index cef582d0..89090d6d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c @@ -1,537 +1,537 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.c - * @author MCD Application Team - * @brief GPIO HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the General Purpose Input/Output (GPIO) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - @verbatim - ============================================================================== - ##### GPIO Peripheral features ##### - ============================================================================== - [..] - Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each - port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software - in several modes: - (+) Input mode - (+) Analog mode - (+) Output mode - (+) Alternate function mode - (+) External interrupt/event lines - - [..] - During and just after reset, the alternate functions and external interrupt - lines are not active and the I/O ports are configured in input floating mode. - - [..] - All GPIO pins have weak internal pull-up and pull-down resistors, which can be - activated or not. - - [..] - In Output or Alternate mode, each IO can be configured on open-drain or push-pull - type and the IO speed can be selected depending on the VDD value. - - [..] - All ports have external interrupt/event capability. To use external interrupt - lines, the port must be configured in input mode. All available GPIO pins are - connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. - - [..] - The external interrupt/event controller consists of up to 23 edge detectors - (16 lines are connected to GPIO) for generating event/interrupt requests (each - input line can be independently configured to select the type (interrupt or event) - and the corresponding trigger event (rising or falling or both). Each line can - also be masked independently. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). - - (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). - (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure - (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef - structure. - (++) In case of Output or alternate function mode selection: the speed is - configured through "Speed" member from GPIO_InitTypeDef structure. - (++) In alternate mode is selection, the alternate function connected to the IO - is configured through "Alternate" member from GPIO_InitTypeDef structure. - (++) Analog mode is required when a pin is to be used as ADC channel - or DAC output. - (++) In case of external interrupt/event selection the "Mode" member from - GPIO_InitTypeDef structure select the type (interrupt or event) and - the corresponding trigger event (rising or falling or both). - - (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority - mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using - HAL_NVIC_EnableIRQ(). - - (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). - - (#) To set/reset the level of a pin configured in output mode use - HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). - - (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). - - - (#) During and just after reset, the alternate functions are not - active and the GPIO pins are configured in input floating mode (except JTAG - pins). - - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose - (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has - priority over the GPIO function. - - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as - general purpose PH0 and PH1, respectively, when the HSE oscillator is off. - The HSE has priority over the GPIO function. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIO GPIO - * @brief GPIO HAL module driver - * @{ - */ - -#ifdef HAL_GPIO_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ -#define GPIO_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 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize and de-initialize the GPIOs - to be ready for use. - -@endverbatim - * @{ - */ - - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t temp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); - assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); - assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Output or Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || - (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Speed parameter */ - assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); - /* Configure the IO Speed */ - temp = GPIOx->OSPEEDR; - temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - temp |= (GPIO_Init->Speed << (position * 2U)); - GPIOx->OSPEEDR = temp; - - /* Configure the IO Output Type */ - temp = GPIOx->OTYPER; - temp &= ~(GPIO_OTYPER_OT_0 << position) ; - temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position); - GPIOx->OTYPER = temp; - } - - /* Activate the Pull-up or Pull down resistor for the current IO */ - temp = GPIOx->PUPDR; - temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - temp |= ((GPIO_Init->Pull) << (position * 2U)); - GPIOx->PUPDR = temp; - - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3U]; - temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - GPIOx->AFR[position >> 3U] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - GPIOx->MODER = temp; - - /*--------------------- EXTI Mode Configuration ------------------------*/ - /* Configure the External Interrupt or event for the current IO */ - if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) - { - /* Enable SYSCFG Clock */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(0x0FU << (4U * (position & 0x03U))); - temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - SYSCFG->EXTICR[position >> 2U] = temp; - - /* Clear EXTI line configuration */ - temp = EXTI->IMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) - { - temp |= iocurrent; - } - EXTI->IMR = temp; - - temp = EXTI->EMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) - { - temp |= iocurrent; - } - EXTI->EMR = temp; - - /* Clear Rising Falling edge configuration */ - temp = EXTI->RTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) - { - temp |= iocurrent; - } - EXTI->RTSR = temp; - - temp = EXTI->FTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) - { - temp |= iocurrent; - } - EXTI->FTSR = temp; - } - } - } -} - -/** - * @brief De-initializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t tmp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (GPIO_Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*------------------------- EXTI Mode Configuration --------------------*/ - tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (0x0FU << (4U * (position & 0x03U))); - if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~((uint32_t)iocurrent); - EXTI->EMR &= ~((uint32_t)iocurrent); - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~((uint32_t)iocurrent); - EXTI->FTSR &= ~((uint32_t)iocurrent); - - /* Configure the External Interrupt or event for the current IO */ - tmp = 0x0FU << (4U * (position & 0x03U)); - SYSCFG->EXTICR[position >> 2U] &= ~tmp; - } - - /*------------------------- GPIO Mode Configuration --------------------*/ - /* Configure IO Direction in Input Floating Mode */ - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); - - /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - - /* Configure the default value IO Output Type */ - GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - } - } -} - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to read. - * This parameter can be GPIO_PIN_x where x can be (0..15). - * @retval The input port pin value. - */ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - GPIO_PinState bitstatus; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) - { - bitstatus = GPIO_PIN_SET; - } - else - { - bitstatus = GPIO_PIN_RESET; - } - return bitstatus; -} - -/** - * @brief Sets or clears the selected data port bit. - * - * @note This function uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @param PinState specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg GPIO_PIN_RESET: to clear the port pin - * @arg GPIO_PIN_SET: to set the port pin - * @retval None - */ -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_PIN_ACTION(PinState)); - - if(PinState != GPIO_PIN_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - } -} - -/** - * @brief Toggles the specified GPIO pins. - * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin Specifies the pins to be toggled. - * @retval None - */ -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; - } - else - { - GPIOx->BSRR = GPIO_Pin; - } -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family - * @param GPIO_Pin specifies the port bit to be locked. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = GPIO_LCKR_LCKK; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* Apply lock key write sequence */ - tmp |= GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Read LCKR register. This read is mandatory to complete key lock sequence */ - tmp = GPIOx->LCKR; - - /* Read again in order to confirm lock is active */ - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) - { - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief This function handles EXTI interrupt request. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) -{ - /* EXTI line interrupt detected */ - if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) - { - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); - HAL_GPIO_EXTI_Callback(GPIO_Pin); - } -} - -/** - * @brief EXTI line detection callbacks. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIO_Pin); - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_GPIO_EXTI_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_GPIO_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.c + * @author MCD Application Team + * @brief GPIO HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the General Purpose Input/Output (GPIO) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @verbatim + ============================================================================== + ##### GPIO Peripheral features ##### + ============================================================================== + [..] + Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each + port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software + in several modes: + (+) Input mode + (+) Analog mode + (+) Output mode + (+) Alternate function mode + (+) External interrupt/event lines + + [..] + During and just after reset, the alternate functions and external interrupt + lines are not active and the I/O ports are configured in input floating mode. + + [..] + All GPIO pins have weak internal pull-up and pull-down resistors, which can be + activated or not. + + [..] + In Output or Alternate mode, each IO can be configured on open-drain or push-pull + type and the IO speed can be selected depending on the VDD value. + + [..] + All ports have external interrupt/event capability. To use external interrupt + lines, the port must be configured in input mode. All available GPIO pins are + connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. + + [..] + The external interrupt/event controller consists of up to 23 edge detectors + (16 lines are connected to GPIO) for generating event/interrupt requests (each + input line can be independently configured to select the type (interrupt or event) + and the corresponding trigger event (rising or falling or both). Each line can + also be masked independently. + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). + + (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). + (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure + (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef + structure. + (++) In case of Output or alternate function mode selection: the speed is + configured through "Speed" member from GPIO_InitTypeDef structure. + (++) In alternate mode is selection, the alternate function connected to the IO + is configured through "Alternate" member from GPIO_InitTypeDef structure. + (++) Analog mode is required when a pin is to be used as ADC channel + or DAC output. + (++) In case of external interrupt/event selection the "Mode" member from + GPIO_InitTypeDef structure select the type (interrupt or event) and + the corresponding trigger event (rising or falling or both). + + (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority + mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using + HAL_NVIC_EnableIRQ(). + + (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). + + (#) To set/reset the level of a pin configured in output mode use + HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). + + (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). + + + (#) During and just after reset, the alternate functions are not + active and the GPIO pins are configured in input floating mode (except JTAG + pins). + + (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose + (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has + priority over the GPIO function. + + (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as + general purpose PH0 and PH1, respectively, when the HSE oscillator is off. + The HSE has priority over the GPIO function. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIO GPIO + * @brief GPIO HAL module driver + * @{ + */ + +#ifdef HAL_GPIO_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ +#define GPIO_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 +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize and de-initialize the GPIOs + to be ready for use. + +@endverbatim + * @{ + */ + + +/** + * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains + * the configuration information for the specified GPIO peripheral. + * @retval None + */ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t temp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Output or Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || + (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + /* Configure the IO Speed */ + temp = GPIOx->OSPEEDR; + temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + temp |= (GPIO_Init->Speed << (position * 2U)); + GPIOx->OSPEEDR = temp; + + /* Configure the IO Output Type */ + temp = GPIOx->OTYPER; + temp &= ~(GPIO_OTYPER_OT_0 << position) ; + temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position); + GPIOx->OTYPER = temp; + } + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPDR; + temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + temp |= ((GPIO_Init->Pull) << (position * 2U)); + GPIOx->PUPDR = temp; + + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3U]; + temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); + GPIOx->AFR[position >> 3U] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); + GPIOx->MODER = temp; + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) + { + /* Enable SYSCFG Clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + temp = SYSCFG->EXTICR[position >> 2U]; + temp &= ~(0x0FU << (4U * (position & 0x03U))); + temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); + SYSCFG->EXTICR[position >> 2U] = temp; + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) + { + temp |= iocurrent; + } + EXTI->IMR = temp; + + temp = EXTI->EMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) + { + temp |= iocurrent; + } + EXTI->EMR = temp; + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) + { + temp |= iocurrent; + } + EXTI->RTSR = temp; + + temp = EXTI->FTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) + { + temp |= iocurrent; + } + EXTI->FTSR = temp; + } + } + } +} + +/** + * @brief De-initializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t tmp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (GPIO_Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*------------------------- EXTI Mode Configuration --------------------*/ + tmp = SYSCFG->EXTICR[position >> 2U]; + tmp &= (0x0FU << (4U * (position & 0x03U))); + if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~((uint32_t)iocurrent); + EXTI->EMR &= ~((uint32_t)iocurrent); + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~((uint32_t)iocurrent); + EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = 0x0FU << (4U * (position & 0x03U)); + SYSCFG->EXTICR[position >> 2U] &= ~tmp; + } + + /*------------------------- GPIO Mode Configuration --------------------*/ + /* Configure IO Direction in Input Floating Mode */ + GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); + + /* Configure the default Alternate Function in current IO */ + GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + + /* Configure the default value IO Output Type */ + GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; + + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + } + } +} + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + * @brief GPIO Read and Write + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified input port pin. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to read. + * This parameter can be GPIO_PIN_x where x can be (0..15). + * @retval The input port pin value. + */ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + GPIO_PinState bitstatus; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) + { + bitstatus = GPIO_PIN_SET; + } + else + { + bitstatus = GPIO_PIN_RESET; + } + return bitstatus; +} + +/** + * @brief Sets or clears the selected data port bit. + * + * @note This function uses GPIOx_BSRR register to allow atomic read/modify + * accesses. In this way, there is no risk of an IRQ occurring between + * the read and the modify access. + * + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @param PinState specifies the value to be written to the selected bit. + * This parameter can be one of the GPIO_PinState enum values: + * @arg GPIO_PIN_RESET: to clear the port pin + * @arg GPIO_PIN_SET: to set the port pin + * @retval None + */ +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if(PinState != GPIO_PIN_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; + } +} + +/** + * @brief Toggles the specified GPIO pins. + * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin Specifies the pins to be toggled. + * @retval None + */ +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; + } + else + { + GPIOx->BSRR = GPIO_Pin; + } +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, + * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. + * @note The configuration of the locked GPIO pins can no longer be modified + * until the next reset. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family + * @param GPIO_Pin specifies the port bit to be locked. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + __IO uint32_t tmp = GPIO_LCKR_LCKK; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + tmp |= GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Read LCKR register. This read is mandatory to complete key lock sequence */ + tmp = GPIOx->LCKR; + + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + { + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief This function handles EXTI interrupt request. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) +{ + /* EXTI line interrupt detected */ + if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) + { + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + HAL_GPIO_EXTI_Callback(GPIO_Pin); + } +} + +/** + * @brief EXTI line detection callbacks. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(GPIO_Pin); + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_GPIO_EXTI_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + + +/** + * @} + */ + +#endif /* HAL_GPIO_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c index d736e82c..ba2ce59d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c @@ -1,559 +1,559 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.c - * @author MCD Application Team - * @brief PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWR PWR - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Constants - * @{ - */ - -/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask - * @{ - */ -#define PVD_MODE_IT 0x00010000U -#define PVD_MODE_EVT 0x00020000U -#define PVD_RISING_EDGE 0x00000001U -#define PVD_FALLING_EDGE 0x00000002U -/** - * @} - */ - -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - (+) Enable the Power Controller (PWR) APB1 interface clock using the - __HAL_RCC_PWR_CLK_ENABLE() macro. - (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. - * @retval None - */ -void HAL_PWR_DeInit(void) -{ - __HAL_RCC_PWR_FORCE_RESET(); - __HAL_RCC_PWR_RELEASE_RESET(); -} - -/** - * @brief Enables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @retval None - */ -void HAL_PWR_EnableBkUpAccess(void) -{ - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @retval None - */ -void HAL_PWR_DisableBkUpAccess(void) -{ - *(__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_PWR_PVD_EXTI_ENABLE_IT() macro. - (+) The PVD is stopped in Standby mode. - - *** Wake-up pin configuration *** - ================================ - [..] - (+) Wake-up pin is used to wake up the system from Standby mode. This pin is - forced in input pull-down configuration and is active on rising edges. - (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. - (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 - (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 - - *** Low Power modes configuration *** - ===================================== - [..] - The devices feature 3 low-power modes: - (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator - in low power mode - (+) Standby mode: 1.2V domain powered off. - - *** Sleep mode *** - ================== - [..] - (+) Entry: - The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) - functions with - (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - - -@@- The Regulator parameter is not used for the STM32F4 family - and is kept as parameter just to maintain compatibility with the - lower power families (STM32L). - (+) Exit: - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. - It can be switched on again by software after exiting the Stop mode using - the HAL_PWREx_DisableFlashPowerDown() function. - - (+) Entry: - The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON) - function with: - (++) Main regulator ON. - (++) Low Power regulator ON. - (+) Exit: - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - *** Standby mode *** - ==================== - [..] - (+) - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - (++) Entry: - (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. - (++) Exit: - (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wake-up (AWU) from low-power mode *** - ============================================= - [..] - - (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wake-up event, a tamper event or a time-stamp event, without depending on - an external interrupt (Auto-wake-up mode). - - (+) RTC auto-wake-up (AWU) from the Stop and Standby modes - - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to - configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. - - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to configure the RTC to detect the tamper or time stamp event using the - HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. - - (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to - configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration - * information for the PVD. - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) -{ - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); - assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); - - /* Set PLS[7:5] bits according to PVDLevel value */ - MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); - - /* Clear any previous config. Keep it clear if no event or IT mode is selected */ - __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); - __HAL_PWR_PVD_EXTI_DISABLE_IT(); - __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); - - /* Configure interrupt mode */ - if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) - { - __HAL_PWR_PVD_EXTI_ENABLE_IT(); - } - - /* Configure event mode */ - if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) - { - __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); - } - - /* Configure the edge */ - if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); - } - - if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); - } -} - -/** - * @brief Enables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_EnablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_DisablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Enable the wake up pin */ - SET_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Disables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Disable the wake up pin */ - CLEAR_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Enters Sleep mode. - * - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * - * @note In Sleep mode, the systick is stopped to avoid exit from this mode with - * systick interrupt when used as time base for Timeout - * - * @param Regulator Specifies the regulator state in SLEEP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON - * @note This parameter is not used for the STM32F4 family and is kept as parameter - * just to maintain compatibility with the lower power families. - * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - * @retval None - */ -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(SLEEPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* 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 issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param Regulator Specifies the regulator state in Stop mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON - * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction - * @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction - * @retval None - */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select Stop mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_STOPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __SEV(); - __WFE(); - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Enters Standby mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @retval None - */ -void HAL_PWR_EnterSTANDBYMode(void) -{ - /* Select Standby mode */ - SET_BIT(PWR->CR, PWR_CR_PDDS); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief This function handles the PWR PVD interrupt request. - * @note This API should be called under the PVD_IRQHandler(). - * @retval None - */ -void HAL_PWR_PVD_IRQHandler(void) -{ - /* Check PWR Exti flag */ - if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) - { - /* PWR PVD interrupt user callback */ - HAL_PWR_PVDCallback(); - - /* Clear PWR Exti pending bit */ - __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); - } -} - -/** - * @brief PWR PVD interrupt callback - * @retval None - */ -__weak void HAL_PWR_PVDCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PWR_PVDCallback could be implemented in the user file - */ -} - -/** - * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. - * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * Setting this bit is useful when the processor is expected to run only on - * interruptions handling. - * @retval None - */ -void HAL_PWR_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. - * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * @retval None - */ -void HAL_PWR_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enables CORTEX M4 SEVONPEND bit. - * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_EnableSEVOnPend(void) -{ - /* Set SEVONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Disables CORTEX M4 SEVONPEND bit. - * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_DisableSEVOnPend(void) -{ - /* Clear SEVONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWR_Private_Constants + * @{ + */ + +/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask + * @{ + */ +#define PVD_MODE_IT 0x00010000U +#define PVD_MODE_EVT 0x00020000U +#define PVD_RISING_EDGE 0x00000001U +#define PVD_FALLING_EDGE 0x00000002U +/** + * @} + */ + +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + After reset, the backup domain (RTC registers, RTC backup data + registers and backup SRAM) is protected against possible unwanted + write accesses. + To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + __HAL_RCC_PWR_CLK_ENABLE() macro. + (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. + * @retval None + */ +void HAL_PWR_DeInit(void) +{ + __HAL_RCC_PWR_FORCE_RESET(); + __HAL_RCC_PWR_RELEASE_RESET(); +} + +/** + * @brief Enables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + *(__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_PWR_PVD_EXTI_ENABLE_IT() macro. + (+) The PVD is stopped in Standby mode. + + *** Wake-up pin configuration *** + ================================ + [..] + (+) Wake-up pin is used to wake up the system from Standby mode. This pin is + forced in input pull-down configuration and is active on rising edges. + (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. + (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 + (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 + + *** Low Power modes configuration *** + ===================================== + [..] + The devices feature 3 low-power modes: + (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. + (+) Stop mode: all clocks are stopped, regulator running, regulator + in low power mode + (+) Standby mode: 1.2V domain powered off. + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) + functions with + (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + + -@@- The Regulator parameter is not used for the STM32F4 family + and is kept as parameter just to maintain compatibility with the + lower power families (STM32L). + (+) Exit: + Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep mode. + + *** Stop mode *** + ================= + [..] + In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, + and the HSE RC oscillators are disabled. Internal SRAM and register contents + are preserved. + The voltage regulator can be configured either in normal or low-power mode. + To minimize the consumption In Stop mode, FLASH can be powered off before + entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. + It can be switched on again by software after exiting the Stop mode using + the HAL_PWREx_DisableFlashPowerDown() function. + + (+) Entry: + The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON) + function with: + (++) Main regulator ON. + (++) Low Power regulator ON. + (+) Exit: + Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + + *** Standby mode *** + ==================== + [..] + (+) + The Standby mode allows to achieve the lowest power consumption. It is based + on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. + The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and + the HSE oscillator are also switched off. SRAM and register contents are lost + except for the RTC registers, RTC backup registers, backup SRAM and Standby + circuitry. + + The voltage regulator is OFF. + + (++) Entry: + (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. + (++) Exit: + (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, + tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + + *** Auto-wake-up (AWU) from low-power mode *** + ============================================= + [..] + + (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + Wake-up event, a tamper event or a time-stamp event, without depending on + an external interrupt (Auto-wake-up mode). + + (+) RTC auto-wake-up (AWU) from the Stop and Standby modes + + (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to + configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. + + (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it + is necessary to configure the RTC to detect the tamper or time stamp event using the + HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. + + (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to + configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration + * information for the PVD. + * @note Refer to the electrical characteristics of your device datasheet for + * more details about the voltage threshold corresponding to each + * detection level. + * @retval None + */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) +{ + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); + assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); + + /* Set PLS[7:5] bits according to PVDLevel value */ + MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); + + /* Clear any previous config. Keep it clear if no event or IT mode is selected */ + __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); + __HAL_PWR_PVD_EXTI_DISABLE_IT(); + __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + + /* Configure interrupt mode */ + if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) + { + __HAL_PWR_PVD_EXTI_ENABLE_IT(); + } + + /* Configure event mode */ + if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) + { + __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); + } + + /* Configure the edge */ + if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); + } + + if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + } +} + +/** + * @brief Enables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_EnablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_DisablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Enable the wake up pin */ + SET_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Disables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Disable the wake up pin */ + CLEAR_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Enters Sleep mode. + * + * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + * + * @note In Sleep mode, the systick is stopped to avoid exit from this mode with + * systick interrupt when used as time base for Timeout + * + * @param Regulator Specifies the regulator state in SLEEP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON + * @note This parameter is not used for the STM32F4 family and is kept as parameter + * just to maintain compatibility with the lower power families. + * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if(SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* 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 issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * @param Regulator Specifies the regulator state in Stop mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON + * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction + * @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select Stop mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Enters Standby mode. + * @note In Standby mode, all I/O pins are high impedance except for: + * - Reset pad (still available) + * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC + * Alarm out, or RTC clock calibration out. + * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. + * - WKUP pin 1 (PA0) if enabled. + * @retval None + */ +void HAL_PWR_EnterSTANDBYMode(void) +{ + /* Select Standby mode */ + SET_BIT(PWR->CR, PWR_CR_PDDS); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWR_PVD_IRQHandler(void) +{ + /* Check PWR Exti flag */ + if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) + { + /* PWR PVD interrupt user callback */ + HAL_PWR_PVDCallback(); + + /* Clear PWR Exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); + } +} + +/** + * @brief PWR PVD interrupt callback + * @retval None + */ +__weak void HAL_PWR_PVDCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_PWR_PVDCallback could be implemented in the user file + */ +} + +/** + * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. + * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * Setting this bit is useful when the processor is expected to run only on + * interruptions handling. + * @retval None + */ +void HAL_PWR_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. + * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * @retval None + */ +void HAL_PWR_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enables CORTEX M4 SEVONPEND bit. + * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_EnableSEVOnPend(void) +{ + /* Set SEVONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Disables CORTEX M4 SEVONPEND bit. + * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_DisableSEVOnPend(void) +{ + /* Clear SEVONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c index b13988ef..0d26083a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c @@ -1,604 +1,604 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.c - * @author MCD Application Team - * @brief Extended PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of PWR extension peripheral: - * + Peripheral Extended features functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWREx PWREx - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWREx_Private_Constants - * @{ - */ -#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_BKPREG_TIMEOUT_VALUE 1000U -#define PWR_VOSRDY_TIMEOUT_VALUE 1000U -/** - * @} - */ - - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### Peripheral extended features functions ##### - =============================================================================== - - *** Main and Backup Regulators configuration *** - ================================================ - [..] - (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from - the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is - retained even in Standby or VBAT mode when the low power backup regulator - is enabled. It can be considered as an internal EEPROM when VBAT is - always present. You can use the HAL_PWREx_EnableBkUpReg() function to - enable the low power backup regulator. - - (+) When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - (+) The backup SRAM is not mass erased by a tamper event. It is read - protected to prevent confidential data, such as cryptographic private - key, from being accessed. The backup SRAM can be erased only through - the Flash interface when a protection level change from level 1 to - level 0 is requested. - -@- Refer to the description of Read protection (RDP) in the Flash - programming manual. - - (+) The main internal regulator can be configured to have a tradeoff between - performance and power consumption when the device does not operate at - the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() - macro which configure VOS bit in PWR_CR register - - Refer to the product datasheets for more details. - - *** FLASH Power Down configuration **** - ======================================= - [..] - (+) By setting the FPDS bit in the PWR_CR register by using the - HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power - down mode when the device enters Stop mode. When the Flash memory - is in power down mode, an additional startup delay is incurred when - waking up from Stop mode. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL - is OFF and the HSI or HSE clock source is selected as system clock. - The new value programmed is active only when the PLL is ON. - When the PLL is OFF, the voltage scale 3 is automatically selected. - Refer to the datasheets for more details. - - *** Over-Drive and Under-Drive configuration **** - ================================================= - [..] - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has - 2 operating modes available: - (++) Normal mode: The CPU and core logic operate at maximum frequency at a given - voltage scaling (scale 1, scale 2 or scale 3) - (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a - higher frequency than the normal mode for a given voltage scaling (scale 1, - scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and - disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow - the sequence described in Reference manual. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator - supplies a low power voltage to the 1.2V domain, thus preserving the content of registers - and internal SRAM. 2 operating modes are available: - (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only - available when the main regulator or the low power regulator is used in Scale 3 or - low voltage mode. - (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only - available when the main regulator or the low power regulator is in low voltage mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Disables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Enables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_EnableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_DisableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Return Voltage Scaling Range. - * @retval The configured scale for the regulator voltage(VOS bit field). - * The returned value can be one of the following: - * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - */ -uint32_t HAL_PWREx_GetVoltageRange(void) -{ - return (PWR->CR & PWR_CR_VOS); -} - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK = 168 MHz. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK = 144 MHz. - * @note When moving from Range 1 to Range 2, the system frequency must be decreased to - * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. - * When moving from Range 2 to Range 1, the system frequency can be increased to - * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK is 168 MHz. It can be extended to - * 180 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK is 144 MHz. It can be extended to, - * 168 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, - * the maximum value of fHCLK is 120 MHz. - * @note To update the system clock frequency(SYSCLK): - * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). - * - Call the HAL_RCC_OscConfig() to configure the PLL. - * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. - * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). - * @note The scale can be modified only when the HSI or HSE clock source is selected - * as system clock source, otherwise the API returns HAL_ERROR. - * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits - * value in the PWR_CR1 register are not taken in account. - * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. - * @note The new voltage scale is active only when the PLL is ON. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - /* Disable the main PLL */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Enable the main PLL */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xxdevices. - * @retval None - */ -void HAL_PWREx_DisableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_DisableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; -} - -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Activates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ - __HAL_PWR_OVERDRIVE_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Enable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Deactivates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Disable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Disable the Over-drive */ - __HAL_PWR_OVERDRIVE_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Enters in Under-Drive STOP mode. - * - * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * - * @note This mode can be selected only when the Under-Drive is already active - * - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode - * - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param Regulator specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction - * @retval None - */ -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the Under-drive Mode ---------------------------------------------*/ - /* Clear Under-drive flag */ - __HAL_PWR_CLEAR_ODRUDR_FLAG(); - - /* Enable the Under-drive */ - __HAL_PWR_UNDERDRIVE_ENABLE(); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg1 = PWR->CR; - /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ - tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); - - /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ - tmpreg1 |= Regulator; - - /* Store the new value */ - PWR->CR = tmpreg1; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - return HAL_OK; -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.c + * @author MCD Application Team + * @brief Extended PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of PWR extension peripheral: + * + Peripheral Extended features functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWREx PWREx + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWREx_Private_Constants + * @{ + */ +#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_BKPREG_TIMEOUT_VALUE 1000U +#define PWR_VOSRDY_TIMEOUT_VALUE 1000U +/** + * @} + */ + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### Peripheral extended features functions ##### + =============================================================================== + + *** Main and Backup Regulators configuration *** + ================================================ + [..] + (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from + the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is + retained even in Standby or VBAT mode when the low power backup regulator + is enabled. It can be considered as an internal EEPROM when VBAT is + always present. You can use the HAL_PWREx_EnableBkUpReg() function to + enable the low power backup regulator. + + (+) When the backup domain is supplied by VDD (analog switch connected to VDD) + the backup SRAM is powered from VDD which replaces the VBAT power supply to + save battery life. + + (+) The backup SRAM is not mass erased by a tamper event. It is read + protected to prevent confidential data, such as cryptographic private + key, from being accessed. The backup SRAM can be erased only through + the Flash interface when a protection level change from level 1 to + level 0 is requested. + -@- Refer to the description of Read protection (RDP) in the Flash + programming manual. + + (+) The main internal regulator can be configured to have a tradeoff between + performance and power consumption when the device does not operate at + the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() + macro which configure VOS bit in PWR_CR register + + Refer to the product datasheets for more details. + + *** FLASH Power Down configuration **** + ======================================= + [..] + (+) By setting the FPDS bit in the PWR_CR register by using the + HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power + down mode when the device enters Stop mode. When the Flash memory + is in power down mode, an additional startup delay is incurred when + waking up from Stop mode. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL + is OFF and the HSI or HSE clock source is selected as system clock. + The new value programmed is active only when the PLL is ON. + When the PLL is OFF, the voltage scale 3 is automatically selected. + Refer to the datasheets for more details. + + *** Over-Drive and Under-Drive configuration **** + ================================================= + [..] + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has + 2 operating modes available: + (++) Normal mode: The CPU and core logic operate at maximum frequency at a given + voltage scaling (scale 1, scale 2 or scale 3) + (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a + higher frequency than the normal mode for a given voltage scaling (scale 1, + scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and + disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow + the sequence described in Reference manual. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator + supplies a low power voltage to the 1.2V domain, thus preserving the content of registers + and internal SRAM. 2 operating modes are available: + (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only + available when the main regulator or the low power regulator is used in Scale 3 or + low voltage mode. + (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only + available when the main regulator or the low power regulator is in low voltage mode. + +@endverbatim + * @{ + */ + +/** + * @brief Enables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Disables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Enables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_EnableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_DisableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Return Voltage Scaling Range. + * @retval The configured scale for the regulator voltage(VOS bit field). + * The returned value can be one of the following: + * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + */ +uint32_t HAL_PWREx_GetVoltageRange(void) +{ + return (PWR->CR & PWR_CR_VOS); +} + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK = 168 MHz. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK = 144 MHz. + * @note When moving from Range 1 to Range 2, the system frequency must be decreased to + * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. + * When moving from Range 2 to Range 1, the system frequency can be increased to + * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK is 168 MHz. It can be extended to + * 180 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK is 144 MHz. It can be extended to, + * 168 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, + * the maximum value of fHCLK is 120 MHz. + * @note To update the system clock frequency(SYSCLK): + * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). + * - Call the HAL_RCC_OscConfig() to configure the PLL. + * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. + * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). + * @note The scale can be modified only when the HSI or HSE clock source is selected + * as system clock source, otherwise the API returns HAL_ERROR. + * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits + * value in the PWR_CR1 register are not taken in account. + * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. + * @note The new voltage scale is active only when the PLL is ON. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + /* Disable the main PLL */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Enable the main PLL */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xxdevices. + * @retval None + */ +void HAL_PWREx_DisableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_DisableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; +} + +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Activates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ + __HAL_PWR_OVERDRIVE_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Enable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Deactivates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Disable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Disable the Over-drive */ + __HAL_PWR_OVERDRIVE_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Enters in Under-Drive STOP mode. + * + * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * + * @note This mode can be selected only when the Under-Drive is already active + * + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode + * + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + * + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * + * @note When exiting Stop mode by issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * + * @param Regulator specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction + * @retval None + */ +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the Under-drive Mode ---------------------------------------------*/ + /* Clear Under-drive flag */ + __HAL_PWR_CLEAR_ODRUDR_FLAG(); + + /* Enable the Under-drive */ + __HAL_PWR_UNDERDRIVE_ENABLE(); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg1 = PWR->CR; + /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ + tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); + + /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ + tmpreg1 |= Regulator; + + /* Store the new value */ + PWR->CR = tmpreg1; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Select STOP mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + return HAL_OK; +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c index f63dea4c..7640b65f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -1,1114 +1,1114 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.c - * @author MCD Application Team - * @brief RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Reset and Clock Control (RCC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### RCC specific features ##### - ============================================================================== - [..] - After reset the device is running from Internal High Speed oscillator - (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - and I-Cache are disabled, and all peripherals are off except internal - SRAM, Flash and JTAG. - (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (+) The clock for all peripherals is switched off, except the SRAM and FLASH. - (+) All GPIOs are in input floating state, except the JTAG pins which - are assigned to be used for debug purpose. - - [..] - Once the device started from reset, the user application has to: - (+) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (+) Configure the System clock frequency and Flash settings - (+) Configure the AHB and APB busses prescalers - (+) Enable the clock for the peripheral(s) to be used - (+) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle - after the clock enable bit is set on the hardware register - (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle - after the clock enable bit is set on the hardware register - - [..] - Implemented Workaround: - (+) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCC RCC - * @brief RCC HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCC_Private_Constants - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ -#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define MCO1_GPIO_PORT GPIOA -#define MCO1_PIN GPIO_PIN_8 - -#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define MCO2_GPIO_PORT GPIOC -#define MCO2_PIN GPIO_PIN_9 -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Variables RCC Private Variables - * @{ - */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to configure the internal/external oscillators - (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 - and APB2). - - [..] Internal/external clock and PLL configuration - (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - (#) PLL (clocked by HSI or HSE), featuring two different output clocks: - (++) The first output is used to generate the high speed system clock (up to 168 MHz) - (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() - and if a HSE clock failure occurs(HSE used directly or through PLL as System - clock source), the System clocks automatically switched to HSI and an interrupt - is generated if enabled. The interrupt is linked to the Cortex-M4 NMI - (Non-Maskable Interrupt) exception vector. - - (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - - [..] System, AHB and APB busses clocks configuration - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable - prescaler and used to clock the CPU, memory and peripherals mapped - on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived - from AHB clock through configurable prescalers and used to clock - the peripherals mapped on these busses. You can use - "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. - - (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum - frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, - the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, - PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, - PCLK2 100 MHz and PCLK1 50 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - return HAL_OK; -} - -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart, pll_config; - - /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - { - /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; - if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != RCC_OscInitStruct->PLL.PLLN) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != RCC_OscInitStruct->PLL.PLLP) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != RCC_OscInitStruct->PLL.PLLQ)) - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Initializes the CPU, AHB and APB busses clocks according to the specified - * parameters in the RCC_ClkInitStruct. - * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC peripheral. - * @param FLatency FLASH Latency, this parameter depend on device selected - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated by HAL_RCC_GetHCLKFreq() function called within this function - * - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * - * @note Depending on the device voltage range, the software has to set correctly - * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above "Initialization/de-initialization functions") - * @retval None - */ -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) -{ - uint32_t tickstart; - - /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); - assert_param(IS_FLASH_LATENCY(FLatency)); - - /* To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. */ - - /* Increasing the number of wait states because of higher CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - { - /* Set the highest APBx dividers in order to ensure that we do not go through - a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - } - - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - } - - assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - } - - /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - { - assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); - - /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - { - /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - return HAL_ERROR; - } - } - /* PLL is selected as System Clock Source */ - else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - { - /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - return HAL_ERROR; - } - } - /* HSI is selected as System Clock Source */ - else - { - /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - return HAL_ERROR; - } - } - - __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - } - - /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - } - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; - - /* Configure the source of time base considering new system clocks settings */ - HAL_InitTick (uwTickPrio); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions - * @brief RCC clocks control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - -@endverbatim - * @{ - */ - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). - * @note PA8/PC9 should be configured in alternate function mode. - * @param RCC_MCOx specifies the output direction for the clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). - * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). - * @param RCC_MCOSource specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCODiv specifies the MCOx prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have - * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - * @retval None - */ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) -{ - GPIO_InitTypeDef GPIO_InitStruct; - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCOx)); - assert_param(IS_RCC_MCODIV(RCC_MCODiv)); - /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) - { - assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); - - /* MCO1 Clock Enable */ - __MCO1_CLK_ENABLE(); - - /* Configure the MCO1 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); - - /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ -#if defined(RCC_CFGR_MCO1EN) - __HAL_RCC_MCO1_ENABLE(); -#endif /* RCC_CFGR_MCO1EN */ - } -#if defined(RCC_CFGR_MCO2) - else - { - assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); - - /* MCO2 Clock Enable */ - __MCO2_CLK_ENABLE(); - - /* Configure the MCO2 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); - - /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ -#if defined(RCC_CFGR_MCO2EN) - __HAL_RCC_MCO2_ENABLE(); -#endif /* RCC_CFGR_MCO2EN */ - } -#endif /* RCC_CFGR_MCO2 */ -} - -/** - * @brief Enables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @retval None - */ -void HAL_RCC_EnableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Clock Security System. - * @retval None - */ -void HAL_RCC_DisableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns the SYSCLK frequency - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -__weak uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U, pllvco = 0U, pllp = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); - - sysclockfreq = pllvco/pllp; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} - -/** - * @brief Returns the HCLK frequency - * @note Each time HCLK changes, this function must be called to update the - * right HCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated within this function - * @retval HCLK frequency - */ -uint32_t HAL_RCC_GetHCLKFreq(void) -{ - return SystemCoreClock; -} - -/** - * @brief Returns the PCLK1 frequency - * @note Each time PCLK1 changes, this function must be called to update the - * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK1 frequency - */ -uint32_t HAL_RCC_GetPCLK1Freq(void) -{ - /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); -} - -/** - * @brief Returns the PCLK2 frequency - * @note Each time PCLK2 changes, this function must be called to update the - * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK2 frequency - */ -uint32_t HAL_RCC_GetPCLK2Freq(void) -{ - /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * will be configured. - * @retval None - */ -__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); -} - -/** - * @brief Configures the RCC_ClkInitStruct according to the internal - * RCC configuration registers. - * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that - * will be configured. - * @param pFLatency Pointer on the Flash Latency. - * @retval None - */ -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) -{ - /* Set all possible values for the Clock type parameter --------------------*/ - RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - - /* Get the SYSCLK configuration --------------------------------------------*/ - RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); - - /* Get the HCLK configuration ----------------------------------------------*/ - RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); - - /* Get the APB1 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); - - /* Get the APB2 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); - - /* Get the Flash Wait State (Latency) configuration ------------------------*/ - *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); -} - -/** - * @brief This function handles the RCC CSS interrupt request. - * @note This API should be called under the NMI_Handler(). - * @retval None - */ -void HAL_RCC_NMI_IRQHandler(void) -{ - /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) - { - /* RCC Clock Security System interrupt user callback */ - HAL_RCC_CSSCallback(); - - /* Clear RCC CSS pending bit */ - __HAL_RCC_CLEAR_IT(RCC_IT_CSS); - } -} - -/** - * @brief RCC Clock Security System interrupt callback - * @retval None - */ -__weak void HAL_RCC_CSSCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_RCC_CSSCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from Internal High Speed oscillator + (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache + and I-Cache are disabled, and all peripherals are off except internal + SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; + all peripherals mapped on these busses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + + [..] + Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB busses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals which clocks are not + derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) + + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle + after the clock enable bit is set on the hardware register + (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle + after the clock enable bit is set on the hardware register + + [..] + Implemented Workaround: + (+) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC + * @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/* Private macro -------------------------------------------------------------*/ +#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define MCO2_GPIO_PORT GPIOC +#define MCO2_PIN GPIO_PIN_9 +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal/external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + + (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or + through the PLL as System clock source. Can be used also as RTC clock source. + + (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + + (#) PLL (clocked by HSI or HSE), featuring two different output clocks: + (++) The first output is used to generate the high speed system clock (up to 168 MHz) + (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), + the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). + + (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() + and if a HSE clock failure occurs(HSE used directly or through PLL as System + clock source), the System clocks automatically switched to HSI and an interrupt + is generated if enabled. The interrupt is linked to the Cortex-M4 NMI + (Non-Maskable Interrupt) exception vector. + + (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL + clock (through a configurable prescaler) on PA8 pin. + + (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S + clock (through a configurable prescaler) on PC9 pin. + + [..] System, AHB and APB busses clocks configuration + (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these busses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum + frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, + the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, + PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, + PCLK2 100 MHz and PCLK1 50 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + +@endverbatim + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + return HAL_OK; +} + +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart, pll_config; + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + RCC_OscInitStruct->PLL.PLLM | \ + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; + if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != RCC_OscInitStruct->PLL.PLLN) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != RCC_OscInitStruct->PLL.PLLP) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != RCC_OscInitStruct->PLL.PLLQ)) + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Initializes the CPU, AHB and APB busses clocks according to the specified + * parameters in the RCC_ClkInitStruct. + * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC peripheral. + * @param FLatency FLASH Latency, this parameter depend on device selected + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used (enabled by hardware) as system clock source after + * startup from Reset, wake-up from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after startup delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source will be ready. + * + * @note Depending on the device voltage range, the software has to set correctly + * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency + * (for more details refer to section above "Initialization/de-initialization functions") + * @retval None + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + uint32_t tickstart; + + /* Check Null pointer */ + if(RCC_ClkInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + assert_param(IS_FLASH_LATENCY(FLatency)); + + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) and the supply voltage of the device. */ + + /* Increasing the number of wait states because of higher CPU frequency */ + if(FLatency > __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + { + /* Set the highest APBx dividers in order to ensure that we do not go through + a non-spec phase whatever we decrease or increase HCLK. */ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); + } + + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); + } + + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + { + /* Check the HSE ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + return HAL_ERROR; + } + } + /* PLL is selected as System Clock Source */ + else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || + (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) + { + /* Check the PLL ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + return HAL_ERROR; + } + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + return HAL_ERROR; + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if(FLatency < __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + } + + /*-------------------------- PCLK2 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + + /* Configure the source of time base considering new system clocks settings */ + HAL_InitTick (uwTickPrio); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions + * @brief RCC clocks control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + +@endverbatim + * @{ + */ + +/** + * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). + * @note PA8/PC9 should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). + * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param RCC_MCODiv specifies the MCOx prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have + * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + * @retval None + */ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef GPIO_InitStruct; + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + /* RCC_MCO1 */ + if(RCC_MCOx == RCC_MCO1) + { + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + + /* MCO1 Clock Enable */ + __MCO1_CLK_ENABLE(); + + /* Configure the MCO1 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO1_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); + + /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ +#if defined(RCC_CFGR_MCO1EN) + __HAL_RCC_MCO1_ENABLE(); +#endif /* RCC_CFGR_MCO1EN */ + } +#if defined(RCC_CFGR_MCO2) + else + { + assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); + + /* MCO2 Clock Enable */ + __MCO2_CLK_ENABLE(); + + /* Configure the MCO2 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO2_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); + + /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ +#if defined(RCC_CFGR_MCO2EN) + __HAL_RCC_MCO2_ENABLE(); +#endif /* RCC_CFGR_MCO2EN */ + } +#endif /* RCC_CFGR_MCO2 */ +} + +/** + * @brief Enables the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. + * @retval None + */ +void HAL_RCC_EnableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Clock Security System. + * @retval None + */ +void HAL_RCC_DisableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns the SYSCLK frequency + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +__weak uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U, pllvco = 0U, pllp = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); + + sysclockfreq = pllvco/pllp; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} + +/** + * @brief Returns the HCLK frequency + * @note Each time HCLK changes, this function must be called to update the + * right HCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated within this function + * @retval HCLK frequency + */ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/** + * @brief Returns the PCLK1 frequency + * @note Each time PCLK1 changes, this function must be called to update the + * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK1 frequency + */ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); +} + +/** + * @brief Returns the PCLK2 frequency + * @note Each time PCLK2 changes, this function must be called to update the + * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK2 frequency + */ +uint32_t HAL_RCC_GetPCLK2Freq(void) +{ + /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * will be configured. + * @retval None + */ +__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); +} + +/** + * @brief Configures the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that + * will be configured. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Set all possible values for the Clock type parameter --------------------*/ + RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + + /* Get the SYSCLK configuration --------------------------------------------*/ + RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + + /* Get the HCLK configuration ----------------------------------------------*/ + RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + + /* Get the APB1 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); + + /* Get the APB2 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); + + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +} + +/** + * @brief This function handles the RCC CSS interrupt request. + * @note This API should be called under the NMI_Handler(). + * @retval None + */ +void HAL_RCC_NMI_IRQHandler(void) +{ + /* Check RCC CSSF flag */ + if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_CSSCallback(); + + /* Clear RCC CSS pending bit */ + __HAL_RCC_CLEAR_IT(RCC_IT_CSS); + } +} + +/** + * @brief RCC Clock Security System interrupt callback + * @retval None + */ +__weak void HAL_RCC_CSSCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_RCC_CSSCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c index bca349ca..0d3aacc8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c @@ -1,3754 +1,3754 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.c - * @author MCD Application Team - * @brief Extension RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities RCC extension peripheral: - * + Extended Peripheral Control functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCCEx RCCEx - * @brief RCCEx HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCCEx_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions - * @{ - */ - -/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Extended Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - [..] - (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to - select the RTC clock source; in this case the Backup domain will be reset in - order to modify the RTC Clock source, as consequence RTC registers (including - the backup registers) and RCC_BDCR register are set to their reset values. - -@endverbatim - * @{ - */ - -#if defined(STM32F446xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t plli2sp = 0U; - uint32_t plli2sq = 0U; - uint32_t plli2sr = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t plli2sused = 0U; - uint32_t pllsaiused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*------------------------ I2S APB1 configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- I2S APB2 configuration ----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*--------------------------- SAI1 configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------- SAI2 configuration ----------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); - - /* Configure SAI2 Clock source */ - __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- RTC configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ CEC Configuration -------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) - { - /* Check the parameters */ - assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); - - /* Configure the CEC clock source */ - __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- CLK48 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLSAI when it's used as clock source for CLK48 */ - if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- SDIO Configuration -------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SPDIFRX Configuration ---------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - { - /* Check the parameters */ - assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); - - /* Configure the SPDIFRX clock source */ - __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); - /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ - if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- PLLI2S Configuration ------------------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, - I2S on APB2 or SPDIFRX */ - if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - /* Check for PLLI2S/DIVQ parameters */ - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- PLLSAI Configuration -----------------------*/ - /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ - if(pllsaiused == 1U) - { - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) - { - /* check for PLLSAIQ Parameter */ - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - /* check for PLLSAI/DIVQ Parameter */ - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ - /* In Case of PLLI2S is selected as source clock for CLK48 */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Configure the PLLSAI division factors */ - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ - /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ - RCC_PERIPHCLK_SPDIFRX; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - - /* Get the SAI1 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); - - /* Get the SAI2 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CEC clock configuration -----------------------------------------*/ - PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ----------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the SPDIFRX clock configuration -------------------------------------*/ - PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock - * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - uint32_t tmpreg1 = 0U; - /* This variable used to store the SAI clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the SAI clock source */ - uint32_t saiclocksource = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_SAI1: - case RCC_PERIPHCLK_SAI2: - { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) - { - case 0U: /* PLLSAI is the clock source for SAI*/ - { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); - } - break; - } - default : - { - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC, RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t pllsair = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*--------------------------- CLK48 Configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SDIO Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*------------------- Common configuration SAI/I2S -------------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------- I2S configuration -------------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for these peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - - /*---------------------------- CLK48 configuration ------------------------*/ - /* Configure the PLLSAI when it is used as clock source for CLK48 */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI |\ - RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CLK48 clock configuration -------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t plli2sq = 0U; -#endif /* STM32F413xx || STM32F423xx */ - uint32_t plli2sused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------------------- I2S APB1 configuration ---------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------------- I2S APB2 configuration ---------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*----------------------- SAI1 Block A configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------- SAI1 Block B configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - /*------------------------------------ RTC configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------ TIM configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- FMPI2C1 Configuration --------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- CLK48 Configuration ----------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for CLK48 */ - if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- SDIO Configuration -----------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------------------- PLLI2S Configuration --------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or - I2S on APB2*/ - if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - /*-------------------- Set the PLL I2S clock -----------------------------*/ - __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); - - /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Check for PLLI2S/DIVR parameters */ - assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); - - /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); - } -#endif /* STM32F413xx || STM32F423xx */ - - /*----------------- In Case of PLLI2S is just selected ------------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 clock source configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 Audio clock source configuration -------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*-------------------- DFSDM2 clock source configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM2 Audio clock source configuration -------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ - RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 |\ - RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 |\ - RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; -#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ - RCC_PERIPHCLK_DFSDM1_AUDIO; -#endif /* STM32F413xx || STM32F423xx */ - - - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the PLL/PLLI2S division factors -------------------------------------*/ - PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); - PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ---------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the DFSDM1 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); - - /* Get the DFSDM1 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); - -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the DFSDM2 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); - - /* Get the DFSDM2 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); - - /* Get the LPTIM1 clock configuration --------------------------------------*/ - PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); - - /* Get the SAI1 Block Aclock configuration ---------------------------------*/ - PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); - - /* Get the SAI1 Block B clock configuration --------------------------------*/ - PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(I2S..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - - /*---------------------------- I2S Configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); - - /* Configure the I2S clock source */ - __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); - } - - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the I2S clock configuration -----------------------------------------*/ - PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); - - -} -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPBCLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*----------------------- Common configuration SAI/I2S ---------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- I2S configuration -------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the PeriphClkInit according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- I2S configuration ---------------------------*/ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); -#if defined(STM32F411xE) - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); -#endif /* STM32F411xE */ - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - -#if defined(STM32F411xE) - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); -#else - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); -#endif /* STM32F411xE */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F411xE) - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); -#endif /* STM32F411xE */ - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { -#if defined(STM32F411xE) - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } -#else - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } -#endif /* STM32F411xE */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if(Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions - * @brief Extended Clock management functions - * -@verbatim - =============================================================================== - ##### Extended clock management functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the - activation or deactivation of PLLI2S, PLLSAI. -@endverbatim - * @{ - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S. - * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that - * contains the configuration information for the PLLI2S - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -#if defined(RCC_PLLI2SCFGR_PLLI2SP) - assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) - assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLI2S division factors */ -#if defined(STM32F446xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F411xE) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#else - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#endif /* STM32F446xx */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - - /* Wait till PLLI2S is ready */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLI2S. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) -{ - uint32_t tickstart; - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while(READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI. - * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that - * contains the configuration information for the PLLSAI - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); - assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -#if defined(RCC_PLLSAICFGR_PLLSAIP) - assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#if defined(RCC_PLLSAICFGR_PLLSAIR) - assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLSAI division factors */ -#if defined(STM32F446xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ - PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); -#elif defined(STM32F469xx) || defined(STM32F479xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ - PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#else - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#endif /* STM32F446xx */ - - /* Enable the PLLSAI */ - __HAL_RCC_PLLSAI_ENABLE(); - - /* Wait till PLLSAI is ready */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLSAI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) -{ - uint32_t tickstart; - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); - - sysclockfreq = pllvco/pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - - sysclockfreq = pllvco/pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL, PLLI2S and PLLSAI OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - uint32_t tickstart; - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Set HSION bit to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSION); - - /* Wait till HSI is ready */ - while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set HSITRIM[4:0] bits to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Wait till clock switch is ready */ - while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear HSEON, HSEBYP and CSSON bits */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); - - /* Wait till HSE is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear PLLON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); - - /* Wait till PLL is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - -#if defined(RCC_PLLI2S_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLI2SON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLSAI bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); - - /* Wait till PLLSAI is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLSAI_SUPPORT */ - - /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; -#else - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ - - /* Reset PLLI2SCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F411xE) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ - - /* Reset PLLSAICFGR register */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; -#elif defined(STM32F446xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - /* Disable all interrupts */ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); - -#if defined(RCC_CIR_PLLI2SRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -#endif /* RCC_CIR_PLLI2SRDYIE */ - -#if defined(RCC_CIR_PLLSAIRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -#endif /* RCC_CIR_PLLSAIRDYIE */ - - /* Clear all interrupt flags */ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC); - -#if defined(RCC_CIR_PLLI2SRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -#endif /* RCC_CIR_PLLI2SRDYC */ - -#if defined(RCC_CIR_PLLSAIRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -#endif /* RCC_CIR_PLLSAIRDYC */ - - /* Clear LSION bit */ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); - - /* Reset all CSR flags */ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; - - /* Adapt Systick interrupt period */ - if(HAL_InitTick(uwTickPrio) != HAL_OK) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @note This function add the PLL/PLLR factor management during PLL configuration this feature - * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ -#if defined(STM32F446xx) - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#else - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#endif /* STM32F446xx */ - { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ -#if defined(STM32F446xx) - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#else - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#endif /* STM32F446xx */ - { - /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, - RCC_OscInitStruct->PLL.PLLM, - RCC_OscInitStruct->PLL.PLLN, - RCC_OscInitStruct->PLL.PLLP, - RCC_OscInitStruct->PLL.PLLQ, - RCC_OscInitStruct->PLL.PLLR); - - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - return HAL_ERROR; - } - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. - * - * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * @note This function add the PLL/PLLR factor management - * @retval None - */ -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); - RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); -} -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extension RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCCEx RCCEx + * @brief RCCEx HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCCEx_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + [..] + (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + select the RTC clock source; in this case the Backup domain will be reset in + order to modify the RTC Clock source, as consequence RTC registers (including + the backup registers) and RCC_BDCR register are set to their reset values. + +@endverbatim + * @{ + */ + +#if defined(STM32F446xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t plli2sp = 0U; + uint32_t plli2sq = 0U; + uint32_t plli2sr = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t plli2sused = 0U; + uint32_t pllsaiused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*------------------------ I2S APB1 configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- I2S APB2 configuration ----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*--------------------------- SAI1 configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------- SAI2 configuration ----------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); + + /* Configure SAI2 Clock source */ + __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- RTC configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ CEC Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + { + /* Check the parameters */ + assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- CLK48 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLSAI when it's used as clock source for CLK48 */ + if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- SDIO Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SPDIFRX Configuration ---------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) + { + /* Check the parameters */ + assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); + + /* Configure the SPDIFRX clock source */ + __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); + /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ + if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- PLLI2S Configuration ------------------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, + I2S on APB2 or SPDIFRX */ + if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + /* Check for PLLI2S/DIVQ parameters */ + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- PLLSAI Configuration -----------------------*/ + /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ + if(pllsaiused == 1U) + { + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) + { + /* check for PLLSAIQ Parameter */ + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + /* check for PLLSAI/DIVQ Parameter */ + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ + /* In Case of PLLI2S is selected as source clock for CLK48 */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Configure the PLLSAI division factors */ + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ + /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ + RCC_PERIPHCLK_SPDIFRX; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + + /* Get the SAI1 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); + + /* Get the SAI2 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CEC clock configuration -----------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ----------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the SPDIFRX clock configuration -------------------------------------*/ + PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock + * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + uint32_t tmpreg1 = 0U; + /* This variable used to store the SAI clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + /* This variable used to store the SAI clock source */ + uint32_t saiclocksource = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_SAI1: + case RCC_PERIPHCLK_SAI2: + { + saiclocksource = RCC->DCKCFGR; + saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); + switch (saiclocksource) + { + case 0U: /* PLLSAI is the clock source for SAI*/ + { + /* Configure the PLLSAI division factor */ + /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); + } + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + /* SAI_CLK_x = PLL_VCO Output/PLLR */ + tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; + frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ + { + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + frequency = (uint32_t)(HSI_VALUE); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + frequency = (uint32_t)(HSE_VALUE); + } + break; + } + default : + { + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC, RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t pllsair = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*--------------------------- CLK48 Configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SDIO Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*------------------- Common configuration SAI/I2S -------------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------- I2S configuration -------------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for these peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + + /*---------------------------- CLK48 configuration ------------------------*/ + /* Configure the PLLSAI when it is used as clock source for CLK48 */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI |\ + RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CLK48 clock configuration -------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t plli2sq = 0U; +#endif /* STM32F413xx || STM32F423xx */ + uint32_t plli2sused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------------------- I2S APB1 configuration ---------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------------- I2S APB2 configuration ---------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*----------------------- SAI1 Block A configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------- SAI1 Block B configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + /*------------------------------------ RTC configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------ TIM configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- FMPI2C1 Configuration --------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- CLK48 Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for CLK48 */ + if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- SDIO Configuration -----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------------------- PLLI2S Configuration --------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or + I2S on APB2*/ + if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + /*-------------------- Set the PLL I2S clock -----------------------------*/ + __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); + + /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Check for PLLI2S/DIVR parameters */ + assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); + + /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); + } +#endif /* STM32F413xx || STM32F423xx */ + + /*----------------- In Case of PLLI2S is just selected ------------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 clock source configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 Audio clock source configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*-------------------- DFSDM2 clock source configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM2 Audio clock source configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ + RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 |\ + RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 |\ + RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; +#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ + RCC_PERIPHCLK_DFSDM1_AUDIO; +#endif /* STM32F413xx || STM32F423xx */ + + + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the PLL/PLLI2S division factors -------------------------------------*/ + PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); + PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ---------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the DFSDM1 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); + + /* Get the DFSDM1 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); + +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the DFSDM2 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); + + /* Get the DFSDM2 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); + + /* Get the LPTIM1 clock configuration --------------------------------------*/ + PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); + + /* Get the SAI1 Block Aclock configuration ---------------------------------*/ + PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); + + /* Get the SAI1 Block B clock configuration --------------------------------*/ + PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(I2S..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + + /*---------------------------- I2S Configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); + + /* Configure the I2S clock source */ + __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); + } + + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the I2S clock configuration -----------------------------------------*/ + PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); + + +} +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPBCLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*----------------------- Common configuration SAI/I2S ---------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- I2S configuration -------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the PeriphClkInit according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- I2S configuration ---------------------------*/ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); +#if defined(STM32F411xE) + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); +#endif /* STM32F411xE */ + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + +#if defined(STM32F411xE) + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); +#else + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); +#endif /* STM32F411xE */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F411xE) + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); +#endif /* STM32F411xE */ + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { +#if defined(STM32F411xE) + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } +#else + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } +#endif /* STM32F411xE */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Select LSE mode + * + * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * + * @param Mode specifies the LSE mode. + * This parameter can be one of the following values: + * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection + * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection + * @retval None + */ +void HAL_RCCEx_SelectLSEMode(uint8_t Mode) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE_MODE(Mode)); + if(Mode == RCC_LSE_HIGHDRIVE_MODE) + { + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } + else + { + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } +} + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions + * @brief Extended Clock management functions + * +@verbatim + =============================================================================== + ##### Extended clock management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the + activation or deactivation of PLLI2S, PLLSAI. +@endverbatim + * @{ + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S. + * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that + * contains the configuration information for the PLLI2S + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); + assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +#if defined(RCC_PLLI2SCFGR_PLLI2SP) + assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) + assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLI2S division factors */ +#if defined(STM32F446xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F411xE) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#else + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#endif /* STM32F446xx */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + + /* Wait till PLLI2S is ready */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLI2S. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) +{ + uint32_t tickstart; + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while(READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI. + * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that + * contains the configuration information for the PLLSAI + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); + assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +#if defined(RCC_PLLSAICFGR_PLLSAIP) + assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#if defined(RCC_PLLSAICFGR_PLLSAIR) + assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLSAI division factors */ +#if defined(STM32F446xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ + PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); +#elif defined(STM32F469xx) || defined(STM32F479xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ + PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#else + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#endif /* STM32F446xx */ + + /* Enable the PLLSAI */ + __HAL_RCC_PLLSAI_ENABLE(); + + /* Wait till PLLSAI is ready */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLSAI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) +{ + uint32_t tickstart; + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(STM32F446xx) +/** + * @brief Returns the SYSCLK frequency + * + * @note This function implementation is valid only for STM32F446xx devices. + * @note This function add the PLL/PLLR System clock source + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U; + uint32_t pllvco = 0U; + uint32_t pllp = 0U; + uint32_t pllr = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); + + sysclockfreq = pllvco/pllp; + break; + } + case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); + + sysclockfreq = pllvco/pllr; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} +#endif /* STM32F446xx */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE, PLL, PLLI2S and PLLSAI OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart; + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Set HSION bit to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSION); + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set HSITRIM[4:0] bits to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Wait till clock switch is ready */ + while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear HSEON, HSEBYP and CSSON bits */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); + + /* Wait till HSE is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear PLLON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); + + /* Wait till PLL is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + +#if defined(RCC_PLLI2S_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLI2SON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); + + /* Wait till PLLI2S is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLSAI bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); + + /* Wait till PLLSAI is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLSAI_SUPPORT */ + + /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; +#else + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ + + /* Reset PLLI2SCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F411xE) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ + + /* Reset PLLSAICFGR register */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; +#elif defined(STM32F446xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + /* Disable all interrupts */ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); + +#if defined(RCC_CIR_PLLI2SRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +#endif /* RCC_CIR_PLLI2SRDYIE */ + +#if defined(RCC_CIR_PLLSAIRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +#endif /* RCC_CIR_PLLSAIRDYIE */ + + /* Clear all interrupt flags */ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC); + +#if defined(RCC_CIR_PLLI2SRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +#endif /* RCC_CIR_PLLI2SRDYC */ + +#if defined(RCC_CIR_PLLSAIRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +#endif /* RCC_CIR_PLLSAIRDYC */ + + /* Clear LSION bit */ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); + + /* Reset all CSR flags */ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; + + /* Adapt Systick interrupt period */ + if(HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @note This function add the PLL/PLLR factor management during PLL configuration this feature + * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#endif /* STM32F446xx */ + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#endif /* STM32F446xx */ + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLM, + RCC_OscInitStruct->PLL.PLLN, + RCC_OscInitStruct->PLL.PLLP, + RCC_OscInitStruct->PLL.PLLQ, + RCC_OscInitStruct->PLL.PLLR); + + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + return HAL_ERROR; + } + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. + * + * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * @note This function add the PLL/PLLR factor management + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); + RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); +} +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c index b98a29ba..eb98d572 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c @@ -1,6654 +1,6654 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + TIM Time Base Initialization - * + TIM Time Base Start - * + TIM Time Base Start Interruption - * + TIM Time Base Start DMA - * + TIM Output Compare/PWM Initialization - * + TIM Output Compare/PWM Channel Configuration - * + TIM Output Compare/PWM Start - * + TIM Output Compare/PWM Start Interruption - * + TIM Output Compare/PWM Start DMA - * + TIM Input Capture Initialization - * + TIM Input Capture Channel Configuration - * + TIM Input Capture Start - * + TIM Input Capture Start Interruption - * + TIM Input Capture Start DMA - * + TIM One Pulse Initialization - * + TIM One Pulse Channel Configuration - * + TIM One Pulse Start - * + TIM Encoder Interface Initialization - * + TIM Encoder Interface Start - * + TIM Encoder Interface Start Interruption - * + TIM Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + TIM OCRef clear configuration - * + TIM External Clock configuration - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to interconnect - several timers together. - (#) Supports incremental encoder for positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - Initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - *** Callback registration *** - ============================================= - - [..] - The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function @ref HAL_TIM_RegisterCallback() to register a callback. - @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, - the Callback ID and a pointer to the user callback function. - - [..] - Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default - weak function. - @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - - [..] - These functions allow to register/unregister following callbacks: - (+) Base_MspInitCallback : TIM Base Msp Init Callback. - (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. - (+) IC_MspInitCallback : TIM IC Msp Init Callback. - (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. - (+) OC_MspInitCallback : TIM OC Msp Init Callback. - (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. - (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. - (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. - (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. - (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. - (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. - (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. - (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. - (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. - (+) PeriodElapsedCallback : TIM Period Elapsed Callback. - (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. - (+) TriggerCallback : TIM Trigger Callback. - (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. - (+) IC_CaptureCallback : TIM Input Capture Callback. - (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. - (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. - (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. - (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. - (+) ErrorCallback : TIM Error Callback. - (+) CommutationCallback : TIM Commutation Callback. - (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. - (+) BreakCallback : TIM Break Callback. - - [..] -By default, after the Init and when the state is HAL_TIM_STATE_RESET -all interrupt callbacks are set to the corresponding weak functions: - examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). - - [..] - Exception done for MspInit and MspDeInit functions that are reset to the legacy weak - functionalities in the Init / DeInit only when these callbacks are null - (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit - keep and use the user MspInit / MspDeInit callbacks(registered beforehand) - - [..] - Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. - Exception done MspInit / MspDeInit that can be registered / unregistered - in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, - thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. - - [..] - When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Base_MspInitCallback == NULL) - { - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Base_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Base_MspDeInitCallback == NULL) - { - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Base_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief Starts the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Change the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * -@verbatim - ============================================================================== - ##### TIM Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the TIM Output Compare. - (+) Stop the TIM Output Compare. - (+) Start the TIM Output Compare and enable interrupt. - (+) Stop the TIM Output Compare and disable interrupt. - (+) Start the TIM Output Compare and enable DMA transfer. - (+) Stop the TIM Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OC_MspInitCallback == NULL) - { - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OC_MspDeInitCallback == NULL) - { - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * -@verbatim - ============================================================================== - ##### TIM PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM PWM. - (+) De-initialize the TIM PWM. - (+) Start the TIM PWM. - (+) Stop the TIM PWM. - (+) Start the TIM PWM and enable interrupt. - (+) Stop the TIM PWM and disable interrupt. - (+) Start the TIM PWM and enable DMA transfer. - (+) Stop the TIM PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->PWM_MspInitCallback == NULL) - { - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->PWM_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->PWM_MspDeInitCallback == NULL) - { - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - } - /* DeInit the low level hardware */ - htim->PWM_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim TIM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * -@verbatim - ============================================================================== - ##### TIM Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the TIM Input Capture. - (+) Stop the TIM Input Capture. - (+) Start the TIM Input Capture and enable interrupt. - (+) Stop the TIM Input Capture and disable interrupt. - (+) Start the TIM Input Capture and enable DMA transfer. - (+) Stop the TIM Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->IC_MspInitCallback == NULL) - { - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->IC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->IC_MspDeInitCallback == NULL) - { - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->IC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture MSP. - * @param htim TIM Input Capture handle - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * -@verbatim - ============================================================================== - ##### TIM One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the TIM One Pulse. - (+) Stop the TIM One Pulse. - (+) Start the TIM One Pulse and enable interrupt. - (+) Stop the TIM One Pulse and disable interrupt. - (+) Start the TIM One Pulse and enable DMA transfer. - (+) Stop the TIM One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() - * @param htim TIM One Pulse handle - * @param OnePulseMode Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OnePulse_MspInitCallback == NULL) - { - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OnePulse_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim TIM One Pulse handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OnePulse_MspDeInitCallback == NULL) - { - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OnePulse_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * -@verbatim - ============================================================================== - ##### TIM Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the TIM Encoder. - (+) Stop the TIM Encoder. - (+) Start the TIM Encoder and enable interrupt. - (+) Stop the TIM Encoder and disable interrupt. - (+) Start the TIM Encoder and enable DMA transfer. - (+) Stop the TIM Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() - * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together - * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource - * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa - * @param htim TIM Encoder Interface handle - * @param sConfig TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Encoder_MspInitCallback == NULL) - { - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Encoder_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Reset the SMS and ECE bits */ - htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); - tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim TIM Encoder Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Encoder_MspDeInitCallback == NULL) - { - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Encoder_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1 The destination Buffer address for IC1. - * @param pData2 The destination Buffer address for IC2. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_ALL: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - default: - break; - } - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim TIM handle - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - /* Capture compare 1 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) - { - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Break input event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->BreakCallback(htim); -#else - HAL_TIMEx_BreakCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Trigger detection event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM commutation event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM Output Compare handle - * @param sConfig TIM Output Compare configuration structure - * @param Channel TIM Channels to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, - TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim TIM IC handle - * @param sConfig TIM Input Capture configuration structure - * @param Channel TIM Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM PWM handle - * @param sConfig TIM PWM configuration structure - * @param Channel TIM Channels to be configured - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, - TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim TIM One Pulse handle - * @param sConfig TIM One Pulse configuration structure - * @param OutputChannel TIM output channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel TIM input Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @note To output a waveform with a minimum delay user can enable the fast - * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx - * output is forced in response to the edge detection on TIx input, - * without taking in account the comparison. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel) -{ - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if (OutputChannel != InputChannel) - { - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - break; - } - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - break; - } - default: - break; - } - - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - default: - break; - } - /* configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - break; - } - - if (HAL_OK == status) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA capture/compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - default: - break; - } - - /* configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stop the DMA burst reading - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - break; - } - - if (HAL_OK == status) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Generate a software event - * @param htim TIM handle - * @param EventSource specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note Basic timers can only generate an update event. - * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. - * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances - * supporting a break input. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim TIM handle - * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (sClearInputConfig->ClearInputSource) - { - case TIM_CLEARINPUTSOURCE_NONE: - { - /* Clear the OCREF clear selection bit and the the ETR Bits */ - CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); - break; - } - - case TIM_CLEARINPUTSOURCE_ETR: - { - /* Check the parameters */ - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - break; - } - - default: - break; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 1 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - else - { - /* Disable the OCREF clear feature for Channel 1 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - break; - } - case TIM_CHANNEL_2: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 2 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - else - { - /* Disable the OCREF clear feature for Channel 2 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - break; - } - case TIM_CHANNEL_3: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 3 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - else - { - /* Disable the OCREF clear feature for Channel 3 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - break; - } - case TIM_CHANNEL_4: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 4 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - else - { - /* Disable the OCREF clear feature for Channel 4 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - break; - } - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the clock source to be used - * @param htim TIM handle - * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig) -{ - uint32_t tmpsmcr; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - break; - } - - case TIM_CLOCKSOURCE_ETRMODE1: - { - /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - break; - } - - case TIM_CLOCKSOURCE_ETRMODE2: - { - /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - break; - } - - case TIM_CLOCKSOURCE_TI1: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - break; - } - - case TIM_CLOCKSOURCE_TI2: - { - /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI2 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - break; - } - - case TIM_CLOCKSOURCE_TI1ED: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - break; - } - - case TIM_CLOCKSOURCE_ITR0: - case TIM_CLOCKSOURCE_ITR1: - case TIM_CLOCKSOURCE_ITR2: - case TIM_CLOCKSOURCE_ITR3: - { - /* Check whether or not the timer instance supports internal trigger input */ - assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); - - TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); - break; - } - - default: - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim TIM handle. - * @param TI1_Selection Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim TIM handle. - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0U; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - return tmpreg; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) TIM Period elapsed callback - (+) TIM Output Compare callback - (+) TIM Input capture callback - (+) TIM Trigger callback - (+) TIM Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Period elapsed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output Compare callback in non-blocking mode - * @param htim TIM OC handle - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture half complete callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User TIM callback to be used instead of the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @param pCallback pointer to the callback function - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(htim); - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = pCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = pCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Unregister a TIM callback - * TIM callback is redirected to the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(htim); - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak Period Elapsed Callback */ - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak Period Elapsed half complete Callback */ - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak Trigger Callback */ - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak Trigger half complete Callback */ - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC Capture Callback */ - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC Capture half complete Callback */ - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC Delay Elapsed Callback */ - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM Pulse Finished Callback */ - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM Pulse Finished half complete Callback */ - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak Error Callback */ - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak Commutation Callback */ - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak Commutation half complete Callback */ - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak Break Callback */ - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return status; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base handle state. - * @param htim TIM Base handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC handle state. - * @param htim TIM Output Compare handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM handle state. - * @param htim TIM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture handle state. - * @param htim TIM IC handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode handle state. - * @param htim TIM OPM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM Encoder Interface handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @brief TIM DMA error callback - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedHalfCpltCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureHalfCpltCallback(htim); -#else - HAL_TIM_IC_CaptureHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Period Elapse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedHalfCpltCallback(htim); -#else - HAL_TIM_PeriodElapsedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerHalfCpltCallback(htim); -#else - HAL_TIM_TriggerHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief Time Base configuration - * @param TIMx TIM peripheral - * @param Structure TIM Base configuration structure - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - /* Set the auto-reload preload */ - MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = Structure->Prescaler; - - if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter (only for advanced timer) value immediately */ - TIMx->EGR = TIM_EGR_UG; -} - -/** - * @brief Timer Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) - { - /* Check parameters */ - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12U); - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Slave Timer configuration function - * @param htim TIM handle - * @param sSlaveConfig Slave timer configuration - * @retval None - */ -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - if(sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) - { - return HAL_ERROR; - } - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - break; - } - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_ITR0: - case TIM_TS_ITR1: - case TIM_TS_ITR2: - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - break; - } - - default: - break; - } - return HAL_OK; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 - * (on channel2 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4U); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 - * (on channel1 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12U); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param InputTriggerSource The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) -{ - uint32_t tmpsmcr; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. - * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. - * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. - * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. - * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. - * @param ExtTRGFilter External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @param ChannelState specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Reset interrupt callbacks to the legacy weak callbacks. - * @param htim pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void TIM_ResetCallback(TIM_HandleTypeDef *htim) -{ - /* Reset the TIM callback to the legacy weak callbacks */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak PeriodElapsedCallback */ - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak PeriodElapsedHalfCpltCallback */ - htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak TriggerCallback */ - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak TriggerHalfCpltCallback */ - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC_CaptureCallback */ - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC_CaptureHalfCpltCallback */ - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC_DelayElapsedCallback */ - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM_PulseFinishedCallback */ - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM_PulseFinishedHalfCpltCallback */ - htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak ErrorCallback */ - htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak CommutationCallback */ - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak CommutationHalfCpltCallback */ - htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak BreakCallback */ -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function @ref HAL_TIM_RegisterCallback() to register a callback. + @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, + the Callback ID and a pointer to the user callback function. + + [..] + Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default + weak function. + @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + + [..] + These functions allow to register/unregister following callbacks: + (+) Base_MspInitCallback : TIM Base Msp Init Callback. + (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. + (+) IC_MspInitCallback : TIM IC Msp Init Callback. + (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. + (+) OC_MspInitCallback : TIM OC Msp Init Callback. + (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. + (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. + (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. + (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. + (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. + (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. + (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. + (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. + (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. + (+) PeriodElapsedCallback : TIM Period Elapsed Callback. + (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. + (+) TriggerCallback : TIM Trigger Callback. + (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. + (+) IC_CaptureCallback : TIM Input Capture Callback. + (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. + (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. + (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. + (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. + (+) ErrorCallback : TIM Error Callback. + (+) CommutationCallback : TIM Commutation Callback. + (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. + (+) BreakCallback : TIM Break Callback. + + [..] +By default, after the Init and when the state is HAL_TIM_STATE_RESET +all interrupt callbacks are set to the corresponding weak functions: + examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + + [..] + Exception done for MspInit and MspDeInit functions that are reset to the legacy weak + functionalities in the Init / DeInit only when these callbacks are null + (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit + keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + + [..] + Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. + Exception done MspInit / MspDeInit that can be registered / unregistered + in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, + thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + + [..] + When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIM TIM + * @brief TIM HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup TIM_Private_Functions + * @{ + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig); +/** + * @} + */ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * +@verbatim + ============================================================================== + ##### Time Base functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM base. + (+) De-initialize the TIM base. + (+) Start the Time Base. + (+) Stop the Time Base. + (+) Start the Time Base and enable interrupt. + (+) Stop the Time Base and disable interrupt. + (+) Start the Time Base and enable DMA transfer. + (+) Stop the Time Base and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Time base Unit according to the specified + * parameters in the TIM_HandleTypeDef and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Base_MspInitCallback == NULL) + { + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Base_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the Time Base configuration */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Base peripheral + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Base_MspDeInitCallback == NULL) + { + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Base_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspDeInit could be implemented in the user file + */ +} + + +/** + * @brief Starts the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Change the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Enable the TIM Update interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + /* Disable the TIM Update interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * +@verbatim + ============================================================================== + ##### TIM Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Output Compare. + (+) De-initialize the TIM Output Compare. + (+) Start the TIM Output Compare. + (+) Stop the TIM Output Compare. + (+) Start the TIM Output Compare and enable interrupt. + (+) Stop the TIM Output Compare and disable interrupt. + (+) Start the TIM Output Compare and enable DMA transfer. + (+) Stop the TIM Output Compare and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Output Compare according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OC_MspInitCallback == NULL) + { + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the Output Compare */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OC_MspDeInitCallback == NULL) + { + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * +@verbatim + ============================================================================== + ##### TIM PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM PWM. + (+) De-initialize the TIM PWM. + (+) Start the TIM PWM. + (+) Stop the TIM PWM. + (+) Start the TIM PWM and enable interrupt. + (+) Stop the TIM PWM and disable interrupt. + (+) Start the TIM PWM and enable DMA transfer. + (+) Stop the TIM PWM and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM PWM Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->PWM_MspInitCallback == NULL) + { + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->PWM_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the PWM */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->PWM_MspDeInitCallback == NULL) + { + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + } + /* DeInit the low level hardware */ + htim->PWM_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the PWM signal generation. + * @param htim TIM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Capture/Compare 3 request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * +@verbatim + ============================================================================== + ##### TIM Input Capture functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Input Capture. + (+) De-initialize the TIM Input Capture. + (+) Start the TIM Input Capture. + (+) Stop the TIM Input Capture. + (+) Start the TIM Input Capture and enable interrupt. + (+) Stop the TIM Input Capture and disable interrupt. + (+) Start the TIM Input Capture and enable DMA transfer. + (+) Stop the TIM Input Capture and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Input Capture Time base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->IC_MspInitCallback == NULL) + { + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->IC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the input capture */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->IC_MspDeInitCallback == NULL) + { + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->IC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture MSP. + * @param htim TIM Input Capture handle + * @retval None + */ +__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Input Capture MSP. + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * +@verbatim + ============================================================================== + ##### TIM One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM One Pulse. + (+) De-initialize the TIM One Pulse. + (+) Start the TIM One Pulse. + (+) Stop the TIM One Pulse. + (+) Start the TIM One Pulse and enable interrupt. + (+) Stop the TIM One Pulse and disable interrupt. + (+) Start the TIM One Pulse and enable DMA transfer. + (+) Stop the TIM One Pulse and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM One Pulse Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() + * @param htim TIM One Pulse handle + * @param OnePulseMode Select the One pulse mode. + * This parameter can be one of the following values: + * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. + * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_OPM_MODE(OnePulseMode)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OnePulse_MspInitCallback == NULL) + { + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OnePulse_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OnePulse_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the One Pulse Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Reset the OPM Bit */ + htim->Instance->CR1 &= ~TIM_CR1_OPM; + + /* Configure the OPM Mode */ + htim->Instance->CR1 |= OnePulseMode; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM One Pulse + * @param htim TIM One Pulse handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OnePulse_MspDeInitCallback == NULL) + { + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OnePulse_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_OnePulse_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM One Pulse signal generation. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * +@verbatim + ============================================================================== + ##### TIM Encoder functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Encoder. + (+) De-initialize the TIM Encoder. + (+) Start the TIM Encoder. + (+) Stop the TIM Encoder. + (+) Start the TIM Encoder and enable interrupt. + (+) Stop the TIM Encoder and disable interrupt. + (+) Start the TIM Encoder and enable DMA transfer. + (+) Stop the TIM Encoder and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Encoder Interface and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() + * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together + * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource + * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa + * @param htim TIM Encoder Interface handle + * @param sConfig TIM Encoder Interface configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Encoder_MspInitCallback == NULL) + { + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Encoder_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_Encoder_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Reset the SMS and ECE bits */ + htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = htim->Instance->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = htim->Instance->CCER; + + /* Set the encoder Mode */ + tmpsmcr |= sConfig->EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); + tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); + + /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ + tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); + tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); + tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); + tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); + tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); + tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + htim->Instance->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + htim->Instance->CCER = tmpccer; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief DeInitializes the TIM Encoder interface + * @param htim TIM Encoder Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Encoder_MspDeInitCallback == NULL) + { + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Encoder_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Encoder_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Enable the encoder interface channels */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Enable the encoder interface channels */ + /* Enable the capture compare Interrupts 1 and/or 2 */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + } + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 and 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @param pData1 The destination Buffer address for IC1. + * @param pData2 The destination Buffer address for IC2. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_ALL: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + default: + break; + } + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 and 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ +/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief TIM IRQ handler management + * +@verbatim + ============================================================================== + ##### IRQ handler management ##### + ============================================================================== + [..] + This section provides Timer IRQ handler function. + +@endverbatim + * @{ + */ +/** + * @brief This function handles TIM interrupts requests. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + /* Capture compare 1 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) + { + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + } + /* Capture compare 2 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 3 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 4 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* TIM Update event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Break input event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->BreakCallback(htim); +#else + HAL_TIMEx_BreakCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Trigger detection event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM commutation event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief TIM Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. + (+) Configure External Clock source. + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master and the Slave synchronization. + (+) Configure the DMA Burst Mode. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIM Output Compare Channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM Output Compare handle + * @param sConfig TIM Output Compare configuration structure + * @param Channel TIM Channels to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, + TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 1 in Output Compare */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 2 in Output Compare */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 3 in Output Compare */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 4 in Output Compare */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture Channels according to the specified + * parameters in the TIM_IC_InitTypeDef. + * @param htim TIM IC handle + * @param sConfig TIM Input Capture configuration structure + * @param Channel TIM Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (Channel == TIM_CHANNEL_1) + { + /* TI1 Configuration */ + TIM_TI1_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Set the IC2PSC value */ + htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); + } + else if (Channel == TIM_CHANNEL_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + TIM_TI3_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC3PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; + + /* Set the IC3PSC value */ + htim->Instance->CCMR2 |= sConfig->ICPrescaler; + } + else + { + /* TI4 Configuration */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + TIM_TI4_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC4PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; + + /* Set the IC4PSC value */ + htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM PWM handle + * @param sConfig TIM PWM configuration structure + * @param Channel TIM Channels to be configured + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, + TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the Channel 1 in PWM mode */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel1 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the Channel 2 in PWM mode */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel2 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the Channel 3 in PWM mode */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel3 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the Channel 4 in PWM mode */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel4 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse Channels according to the specified + * parameters in the TIM_OnePulse_InitTypeDef. + * @param htim TIM One Pulse handle + * @param sConfig TIM One Pulse configuration structure + * @param OutputChannel TIM output channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @param InputChannel TIM input Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) +{ + TIM_OC_InitTypeDef temp1; + + /* Check the parameters */ + assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); + assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); + + if (OutputChannel != InputChannel) + { + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Extract the Output compare configuration from sConfig structure */ + temp1.OCMode = sConfig->OCMode; + temp1.Pulse = sConfig->Pulse; + temp1.OCPolarity = sConfig->OCPolarity; + temp1.OCNPolarity = sConfig->OCNPolarity; + temp1.OCIdleState = sConfig->OCIdleState; + temp1.OCNIdleState = sConfig->OCNIdleState; + + switch (OutputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_OC1_SetConfig(htim->Instance, &temp1); + break; + } + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_OC2_SetConfig(htim->Instance, &temp1); + break; + } + default: + break; + } + + switch (InputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1FP1; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI2FP2; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, + uint32_t *BurstBuffer, uint32_t BurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + default: + break; + } + /* configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM DMA Burst mode + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + break; + } + + if (HAL_OK == status) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA capture/compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + default: + break; + } + + /* configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stop the DMA burst reading + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + break; + } + + if (HAL_OK == status) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Generate a software event + * @param htim TIM handle + * @param EventSource specifies the event source. + * This parameter can be one of the following values: + * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source + * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EVENTSOURCE_COM: Timer COM event source + * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source + * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source + * @note Basic timers can only generate an update event. + * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. + * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances + * supporting a break input. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_EVENT_SOURCE(EventSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the event sources */ + htim->Instance->EGR = EventSource; + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Configures the OCRef clear feature + * @param htim TIM handle + * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that + * contains the OCREF clear feature and parameters for the TIM peripheral. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (sClearInputConfig->ClearInputSource) + { + case TIM_CLEARINPUTSOURCE_NONE: + { + /* Clear the OCREF clear selection bit and the the ETR Bits */ + CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); + break; + } + + case TIM_CLEARINPUTSOURCE_ETR: + { + /* Check the parameters */ + assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); + assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); + assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); + + /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + TIM_ETR_SetConfig(htim->Instance, + sClearInputConfig->ClearInputPrescaler, + sClearInputConfig->ClearInputPolarity, + sClearInputConfig->ClearInputFilter); + break; + } + + default: + break; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 1 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + else + { + /* Disable the OCREF clear feature for Channel 1 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + break; + } + case TIM_CHANNEL_2: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 2 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + else + { + /* Disable the OCREF clear feature for Channel 2 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + break; + } + case TIM_CHANNEL_3: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 3 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + else + { + /* Disable the OCREF clear feature for Channel 3 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + break; + } + case TIM_CHANNEL_4: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 4 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + else + { + /* Disable the OCREF clear feature for Channel 4 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + break; + } + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the clock source to be used + * @param htim TIM handle + * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that + * contains the clock source information for the TIM peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig) +{ + uint32_t tmpsmcr; + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); + + /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + htim->Instance->SMCR = tmpsmcr; + + switch (sClockSourceConfig->ClockSource) + { + case TIM_CLOCKSOURCE_INTERNAL: + { + assert_param(IS_TIM_INSTANCE(htim->Instance)); + break; + } + + case TIM_CLOCKSOURCE_ETRMODE1: + { + /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + /* Select the External clock mode1 and the ETRF trigger */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + break; + } + + case TIM_CLOCKSOURCE_ETRMODE2: + { + /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= TIM_SMCR_ECE; + break; + } + + case TIM_CLOCKSOURCE_TI1: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); + break; + } + + case TIM_CLOCKSOURCE_TI2: + { + /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI2 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); + break; + } + + case TIM_CLOCKSOURCE_TI1ED: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); + break; + } + + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + { + /* Check whether or not the timer instance supports internal trigger input */ + assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); + + TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); + break; + } + + default: + break; + } + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Selects the signal connected to the TI1 input: direct from CH1_input + * or a XOR combination between CH1_input, CH2_input & CH3_input + * @param htim TIM handle. + * @param TI1_Selection Indicate whether or not channel 1 is connected to the + * output of a XOR gate. + * This parameter can be one of the following values: + * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input + * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 + * pins are connected to the TI1 input (XOR combination) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) +{ + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Reset the TI1 selection */ + tmpcr2 &= ~TIM_CR2_TI1S; + + /* Set the TI1 selection */ + tmpcr2 |= TI1_Selection; + + /* Write to TIMxCR2 */ + htim->Instance->CR2 = tmpcr2; + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Disable Trigger Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode in interrupt mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Enable Trigger Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Read the captured value from Capture Compare unit + * @param htim TIM handle. + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval Captured value + */ +uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpreg = 0U; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Return the capture 1 value */ + tmpreg = htim->Instance->CCR1; + + break; + } + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Return the capture 2 value */ + tmpreg = htim->Instance->CCR2; + + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Return the capture 3 value */ + tmpreg = htim->Instance->CCR3; + + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Return the capture 4 value */ + tmpreg = htim->Instance->CCR4; + + break; + } + + default: + break; + } + + return tmpreg; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * +@verbatim + ============================================================================== + ##### TIM Callbacks functions ##### + ============================================================================== + [..] + This section provides TIM callback functions: + (+) TIM Period elapsed callback + (+) TIM Output Compare callback + (+) TIM Input capture callback + (+) TIM Trigger callback + (+) TIM Error callback + +@endverbatim + * @{ + */ + +/** + * @brief Period elapsed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Period elapsed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim TIM OC handle + * @retval None + */ +__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture half complete callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Timer error callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_ErrorCallback could be implemented in the user file + */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User TIM callback to be used instead of the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @param pCallback pointer to the callback function + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = pCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = pCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Unregister a TIM callback + * TIM callback is redirected to the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak Period Elapsed Callback */ + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak Period Elapsed half complete Callback */ + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak Trigger Callback */ + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak Trigger half complete Callback */ + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC Capture Callback */ + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC Capture half complete Callback */ + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC Delay Elapsed Callback */ + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM Pulse Finished Callback */ + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM Pulse Finished half complete Callback */ + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak Error Callback */ + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak Commutation Callback */ + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak Commutation half complete Callback */ + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak Break Callback */ + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief TIM Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Base handle state. + * @param htim TIM Base handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM OC handle state. + * @param htim TIM Output Compare handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM PWM handle state. + * @param htim TIM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Input Capture handle state. + * @param htim TIM IC handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM One Pulse Mode handle state. + * @param htim TIM OPM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM Encoder Interface handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ + +/** + * @brief TIM DMA error callback + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMAError(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Delay Pulse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedHalfCpltCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureHalfCpltCallback(htim); +#else + HAL_TIM_IC_CaptureHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Period Elapse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Period Elapse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedHalfCpltCallback(htim); +#else + HAL_TIM_PeriodElapsedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerHalfCpltCallback(htim); +#else + HAL_TIM_TriggerHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief Time Base configuration + * @param TIMx TIM peripheral + * @param Structure TIM Base configuration structure + * @retval None + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure) +{ + uint32_t tmpcr1; + tmpcr1 = TIMx->CR1; + + /* Set TIM Time Base Unit parameters ---------------------------------------*/ + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); + tmpcr1 |= Structure->CounterMode; + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + tmpcr1 &= ~TIM_CR1_CKD; + tmpcr1 |= (uint32_t)Structure->ClockDivision; + } + + /* Set the auto-reload preload */ + MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); + + TIMx->CR1 = tmpcr1; + + /* Set the Autoreload value */ + TIMx->ARR = (uint32_t)Structure->Period ; + + /* Set the Prescaler value */ + TIMx->PSC = Structure->Prescaler; + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = Structure->RepetitionCounter; + } + + /* Generate an update event to reload the Prescaler + and the repetition counter (only for advanced timer) value immediately */ + TIMx->EGR = TIM_EGR_UG; +} + +/** + * @brief Timer Output Compare 1 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~TIM_CCMR1_OC1M; + tmpccmrx &= ~TIM_CCMR1_CC1S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC1P; + /* Set the Output Compare Polarity */ + tmpccer |= OC_Config->OCPolarity; + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) + { + /* Check parameters */ + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC1NP; + /* Set the Output N Polarity */ + tmpccer |= OC_Config->OCNPolarity; + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC1NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS1; + tmpcr2 &= ~TIM_CR2_OIS1N; + /* Set the Output Idle state */ + tmpcr2 |= OC_Config->OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= OC_Config->OCNIdleState; + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 2 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR1_OC2M; + tmpccmrx &= ~TIM_CCMR1_CC2S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC2P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 4U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC2NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 4U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC2NE; + + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS2; + tmpcr2 &= ~TIM_CR2_OIS2N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 2U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 2U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 3 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 3: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC3M; + tmpccmrx &= ~TIM_CCMR2_CC3S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC3P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 8U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC3NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 8U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC3NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS3; + tmpcr2 &= ~TIM_CR2_OIS3N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 4U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 4U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 4 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC4M; + tmpccmrx &= ~TIM_CCMR2_CC4S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC4P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS4; + + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Slave Timer configuration function + * @param htim TIM handle + * @param sSlaveConfig Slave timer configuration + * @retval None + */ +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the Trigger Selection Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source */ + tmpsmcr |= sSlaveConfig->InputTrigger; + + /* Reset the slave mode Bits */ + tmpsmcr &= ~TIM_SMCR_SMS; + /* Set the slave mode */ + tmpsmcr |= sSlaveConfig->SlaveMode; + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Configure the trigger prescaler, filter, and polarity */ + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_ETRF: + { + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + /* Configure the ETR Trigger source */ + TIM_ETR_SetConfig(htim->Instance, + sSlaveConfig->TriggerPrescaler, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI1F_ED: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + if(sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) + { + return HAL_ERROR; + } + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = htim->Instance->CCER; + htim->Instance->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = htim->Instance->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + htim->Instance->CCMR1 = tmpccmr1; + htim->Instance->CCER = tmpccer; + break; + } + + case TIM_TS_TI1FP1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI1 Filter and Polarity */ + TIM_TI1_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI2FP2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI2 Filter and Polarity */ + TIM_TI2_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + { + /* Check the parameter */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + break; + } + + default: + break; + } + return HAL_OK; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 + * (on channel2 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) + { + tmpccmr1 &= ~TIM_CCMR1_CC1S; + tmpccmr1 |= TIM_ICSelection; + } + else + { + tmpccmr1 |= TIM_CCMR1_CC1S_0; + } + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI1. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= (TIM_ICFilter << 4U); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= TIM_ICPolarity; + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 + * (on channel1 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr1 &= ~TIM_CCMR1_CC2S; + tmpccmr1 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI2. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= (TIM_ICFilter << 12U); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (TIM_ICPolarity << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC3S; + tmpccmr2 |= TIM_ICSelection; + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC3F; + tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); + + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); + tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + * @retval None + */ +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC4S; + tmpccmr2 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC4F; + tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); + tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx to select the TIM peripheral + * @param InputTriggerSource The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) +{ + uint32_t tmpsmcr; + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source and the slave mode*/ + tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx to select the TIM peripheral + * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. + * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. + * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. + * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. + * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. + * @param ExtTRGFilter External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmcr; + + tmpsmcr = TIMx->SMCR; + + /* Reset the ETR Bits */ + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @param ChannelState specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. + * @retval None + */ +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_TIM_CHANNELS(Channel)); + + tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Reset interrupt callbacks to the legacy weak callbacks. + * @param htim pointer to a TIM_HandleTypeDef structure that contains + * the configuration information for TIM module. + * @retval None + */ +void TIM_ResetCallback(TIM_HandleTypeDef *htim) +{ + /* Reset the TIM callback to the legacy weak callbacks */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak PeriodElapsedCallback */ + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak PeriodElapsedHalfCpltCallback */ + htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak TriggerCallback */ + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak TriggerHalfCpltCallback */ + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC_CaptureCallback */ + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC_CaptureHalfCpltCallback */ + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC_DelayElapsedCallback */ + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM_PulseFinishedCallback */ + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM_PulseFinishedHalfCpltCallback */ + htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak ErrorCallback */ + htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak CommutationCallback */ + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak CommutationHalfCpltCallback */ + htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak BreakCallback */ +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c rename to itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c index 7988a786..99a13c0f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ b/itemis.create.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c @@ -1,1978 +1,1978 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer Extended peripheral: - * + Time Hall Sensor Interface Initialization - * + Time Hall Sensor Interface Start - * + Time Complementary signal break and dead time configuration - * + Time Master and Slave synchronization configuration - * + Timer remapping capabilities configuration - @verbatim - ============================================================================== - ##### TIMER Extended features ##### - ============================================================================== - [..] - The Timer Extended features include: - (#) Complementary outputs with programmable dead-time for : - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to - interconnect several timers together. - (#) Break input to put the timer output signals in reset state or in a known state. - (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for - positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the - Timer Hall Sensor Interface and the commutation event with the corresponding - Interrupt and DMA request if needed (Note that One Timer is used to interface - with the Hall sensor Interface and another Timer should be used to use - the commutation event). - - (#) Activate the TIM peripheral using one of the start functions: - (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT() - (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT() - (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() - (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT(). - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIMEx TIMEx - * @brief TIM Extended HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * -@verbatim - ============================================================================== - ##### Timer Hall Sensor functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure TIM HAL Sensor. - (+) De-initialize TIM HAL Sensor. - (+) Start the Hall Sensor Interface. - (+) Stop the Hall Sensor Interface. - (+) Start the Hall Sensor Interface and enable interrupts. - (+) Stop the Hall Sensor Interface and disable interrupts. - (+) Start the Hall Sensor Interface and enable DMA transfers. - (+) Stop the Hall Sensor Interface and disable DMA transfers. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. - * @param htim TIM Hall Sensor Interface handle - * @param sConfig TIM Hall Sensor configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig) -{ - TIM_OC_InitTypeDef OC_Config; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy week callbacks */ - TIM_ResetCallback(htim); - - if (htim->HallSensor_MspInitCallback == NULL) - { - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->HallSensor_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIMEx_HallSensor_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ - TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->IC1Prescaler; - - /* Enable the Hall sensor interface (XOR function of the three inputs) */ - htim->Instance->CR2 |= TIM_CR2_TI1S; - - /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1F_ED; - - /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; - - /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ - OC_Config.OCFastMode = TIM_OCFAST_DISABLE; - OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; - OC_Config.OCMode = TIM_OCMODE_PWM2; - OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; - OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; - OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; - OC_Config.Pulse = sConfig->Commutation_Delay; - - TIM_OC2_SetConfig(htim->Instance, &OC_Config); - - /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 - register to 101 */ - htim->Instance->CR2 &= ~TIM_CR2_MMS; - htim->Instance->CR2 |= TIM_TRGO_OC2REF; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Hall Sensor interface - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->HallSensor_MspDeInitCallback == NULL) - { - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - } - /* DeInit the low level hardware */ - htim->HallSensor_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIMEx_HallSensor_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Hall Sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1, 2 and 3 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Enable the capture compare Interrupts 1 event */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts event */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Set the DMA Input Capture 1 Callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream for Capture 1*/ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the capture compare 1 Interrupt */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - - /* Disable the capture compare Interrupts 1 event */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * -@verbatim - ============================================================================== - ##### Timer Complementary Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary Output Compare/PWM. - (+) Stop the Complementary Output Compare/PWM. - (+) Start the Complementary Output Compare/PWM and enable interrupts. - (+) Stop the Complementary Output Compare/PWM and disable interrupts. - (+) Start the Complementary Output Compare/PWM and enable DMA transfers. - (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM OC handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - - default: - break; - } - - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpccer; - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * -@verbatim - ============================================================================== - ##### Timer Complementary PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary PWM. - (+) Stop the Complementary PWM. - (+) Start the Complementary PWM and enable interrupts. - (+) Stop the Complementary PWM and disable interrupts. - (+) Start the Complementary PWM and enable DMA transfers. - (+) Stop the Complementary PWM and disable DMA transfers. - (+) Start the Complementary Input Capture measurement. - (+) Stop the Complementary Input Capture. - (+) Start the Complementary Input Capture and enable interrupts. - (+) Stop the Complementary Input Capture and disable interrupts. - (+) Start the Complementary Input Capture and enable DMA transfers. - (+) Stop the Complementary Input Capture and disable DMA transfers. - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode on the - * complementary output - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - break; - } - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode on the complementary - * output - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - break; - } - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * -@verbatim - ============================================================================== - ##### Timer Complementary One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM One Pulse signal generation on the complementary - * output. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Enable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation on the complementary - * output. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - /* Enable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure the commutation event in case of use of the Hall sensor interface. - (+) Configure Output channels for OC and PWM mode. - - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master synchronization. - (+) Configure timer remapping capabilities. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the TIM commutation event sequence. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with interrupt. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - /* Enable the Commutation Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with DMA. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Enable the Commutation DMA Request */ - /* Set the DMA Commutation Callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Enable the Commutation DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in master mode. - * @param htim TIM handle. - * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that - * contains the selected trigger output (TRGO) and the Master/Slave - * mode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - TIM_MasterConfigTypeDef *sMasterConfig) -{ - uint32_t tmpcr2; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); - assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Change the handler state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the MMS Bits */ - tmpcr2 &= ~TIM_CR2_MMS; - /* Select the TRGO source */ - tmpcr2 |= sMasterConfig->MasterOutputTrigger; - - /* Update TIMx CR2 */ - htim->Instance->CR2 = tmpcr2; - - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param htim TIM handle - * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @note Interrupts can be generated when an active level is detected on the - * break input, the break 2 input or the system break input. Break - * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) -{ - /* Keep this variable initialized to 0 as it is used to configure BDTR register */ - uint32_t tmpbdtr = 0U; - - /* Check the parameters */ - assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); - assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); - assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); - assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); - assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - - /* Set the BDTR bits */ - MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); - MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); - MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); - - - /* Set TIMx_BDTR */ - htim->Instance->BDTR = tmpbdtr; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIMx Remapping input capabilities. - * @param htim TIM handle. - * @param Remap specifies the TIM remapping source. - * For TIM1, the parameter can have the following values: (**) - * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO - * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output - * - * For TIM2, the parameter can have the following values: (**) - * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) - * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) - * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * - * For TIM5, the parameter can have the following values: - * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO - * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI - * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE - * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt - * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) - * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) - * - * For TIM9, the parameter can have the following values: (**) - * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO - * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output - * - * For TIM11, the parameter can have the following values: - * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO - * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock - * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) - * - * (*) Value not defined in all devices. \n - * (**) Register not available in all devices. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) -{ - __HAL_LOCK(htim); - - /* Check parameters */ - assert_param(IS_TIM_REMAP(htim->Instance, Remap)); - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) - if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - __HAL_RCC_LPTIM1_CLK_ENABLE(); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LPTIM_REMAP_MASK)); - } - else - { - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); - } -#else - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * -@verbatim - ============================================================================== - ##### Extended Callbacks functions ##### - ============================================================================== - [..] - This section provides Extended TIM callback functions: - (+) Timer Commutation callback - (+) Timer Break callback - -@endverbatim - * @{ - */ - -/** - * @brief Hall commutation changed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutCallback could be implemented in the user file - */ -} -/** - * @brief Hall commutation changed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Break detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_BreakCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * -@verbatim - ============================================================================== - ##### Extended Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Hall Sensor interface handle state. - * @param htim TIM Hall Sensor handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIMEx Private Functions - * @{ - */ - -/** - * @brief TIM DMA Commutation callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Commutation half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationHalfCpltCallback(htim); -#else - HAL_TIMEx_CommutHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @param ChannelNState specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. - * @retval None - */ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) -{ - uint32_t tmp; - - tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxNE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer Extended peripheral: + * + Time Hall Sensor Interface Initialization + * + Time Hall Sensor Interface Start + * + Time Complementary signal break and dead time configuration + * + Time Master and Slave synchronization configuration + * + Timer remapping capabilities configuration + @verbatim + ============================================================================== + ##### TIMER Extended features ##### + ============================================================================== + [..] + The Timer Extended features include: + (#) Complementary outputs with programmable dead-time for : + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to + interconnect several timers together. + (#) Break input to put the timer output signals in reset state or in a known state. + (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for + positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + initialization function of this driver: + (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the + Timer Hall Sensor Interface and the commutation event with the corresponding + Interrupt and DMA request if needed (Note that One Timer is used to interface + with the Hall sensor Interface and another Timer should be used to use + the commutation event). + + (#) Activate the TIM peripheral using one of the start functions: + (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT() + (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT() + (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() + (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT(). + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig) +{ + TIM_OC_InitTypeDef OC_Config; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy week callbacks */ + TIM_ResetCallback(htim); + + if (htim->HallSensor_MspInitCallback == NULL) + { + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->HallSensor_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_HallSensor_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ + TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->IC1Prescaler; + + /* Enable the Hall sensor interface (XOR function of the three inputs) */ + htim->Instance->CR2 |= TIM_CR2_TI1S; + + /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1F_ED; + + /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; + + /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ + OC_Config.OCFastMode = TIM_OCFAST_DISABLE; + OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; + OC_Config.OCMode = TIM_OCMODE_PWM2; + OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; + OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; + OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; + OC_Config.Pulse = sConfig->Commutation_Delay; + + TIM_OC2_SetConfig(htim->Instance, &OC_Config); + + /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 + register to 101 */ + htim->Instance->CR2 &= ~TIM_CR2_MMS; + htim->Instance->CR2 |= TIM_TRGO_OC2REF; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + break; + } + + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpccer; + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. + (+) Start the Complementary Input Capture measurement. + (+) Stop the Complementary Input Capture. + (+) Start the Complementary Input Capture and enable interrupts. + (+) Stop the Complementary Input Capture and disable interrupts. + (+) Start the Complementary Input Capture and enable DMA transfers. + (+) Stop the Complementary Input Capture and disable DMA transfers. + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + break; + } + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode on the complementary + * output + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + break; + } + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * +@verbatim + ============================================================================== + ##### Timer Complementary One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM One Pulse signal generation on the complementary + * output. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Enable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation on the complementary + * output. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + /* Enable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure the commutation event in case of use of the Hall sensor interface. + (+) Configure Output channels for OC and PWM mode. + + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master synchronization. + (+) Configure timer remapping capabilities. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig) +{ + uint32_t tmpcr2; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); + assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Change the handler state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the MMS Bits */ + tmpcr2 &= ~TIM_CR2_MMS; + /* Select the TRGO source */ + tmpcr2 |= sMasterConfig->MasterOutputTrigger; + + /* Update TIMx CR2 */ + htim->Instance->CR2 = tmpcr2; + + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State + * and the AOE(automatic output enable). + * @param htim TIM handle + * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t tmpbdtr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); + assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); + assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); + assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); + assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = tmpbdtr; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIMx Remapping input capabilities. + * @param htim TIM handle. + * @param Remap specifies the TIM remapping source. + * For TIM1, the parameter can have the following values: (**) + * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO + * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output + * + * For TIM2, the parameter can have the following values: (**) + * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) + * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) + * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * + * For TIM5, the parameter can have the following values: + * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO + * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI + * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE + * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt + * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) + * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) + * + * For TIM9, the parameter can have the following values: (**) + * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO + * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output + * + * For TIM11, the parameter can have the following values: + * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO + * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock + * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) + * + * (*) Value not defined in all devices. \n + * (**) Register not available in all devices. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) +{ + __HAL_LOCK(htim); + + /* Check parameters */ + assert_param(IS_TIM_REMAP(htim->Instance, Remap)); + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) + if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) + { + /* Connect TIMx internal trigger to LPTIM1 output */ + __HAL_RCC_LPTIM1_CLK_ENABLE(); + MODIFY_REG(LPTIM1->OR, + (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), + Remap & ~(LPTIM_REMAP_MASK)); + } + else + { + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); + } +#else + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief Hall commutation changed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutCallback could be implemented in the user file + */ +} +/** + * @brief Hall commutation changed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Break detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_BreakCallback could be implemented in the user file + */ +} +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * +@verbatim + ============================================================================== + ##### Extended Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Hall Sensor interface handle state. + * @param htim TIM Hall Sensor handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxNE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/STM32F407VGTX_FLASH.ld b/itemis.create.examples.stm32f407vg.blinky/STM32F407VGTX_FLASH.ld similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/STM32F407VGTX_FLASH.ld rename to itemis.create.examples.stm32f407vg.blinky/STM32F407VGTX_FLASH.ld diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/STM32F407VGTX_RAM.ld b/itemis.create.examples.stm32f407vg.blinky/STM32F407VGTX_RAM.ld similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/STM32F407VGTX_RAM.ld rename to itemis.create.examples.stm32f407vg.blinky/STM32F407VGTX_RAM.ld diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc b/itemis.create.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc rename to itemis.create.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc index a5eda815..5fd188d0 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc +++ b/itemis.create.examples.stm32f407vg.blinky/com.yakindu.sct.examples.stm32f407vg.blinky.ioc @@ -68,8 +68,8 @@ ProjectManager.MainLocation=Core/Src ProjectManager.NoMain=false ProjectManager.PreviousToolchain= ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=org.yakindu.sct.examples.stm32f407vg.blinky.ioc -ProjectManager.ProjectName=org.yakindu.sct.examples.stm32f407vg.blinky +ProjectManager.ProjectFileName=itemis.create.examples.stm32f407vg.blinky.ioc +ProjectManager.ProjectName=itemis.create.examples.stm32f407vg.blinky ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.ToolChainLocation= diff --git a/org.yakindu.sct.examples.sctunit.c/css/style.css b/itemis.create.examples.stm32f407vg.blinky/css/style.css similarity index 100% rename from org.yakindu.sct.examples.sctunit.c/css/style.css rename to itemis.create.examples.stm32f407vg.blinky/css/style.css diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/images/stm.png b/itemis.create.examples.stm32f407vg.blinky/images/stm.png similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/images/stm.png rename to itemis.create.examples.stm32f407vg.blinky/images/stm.png diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/images/stm_configuration.png b/itemis.create.examples.stm32f407vg.blinky/images/stm_configuration.png similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/images/stm_configuration.png rename to itemis.create.examples.stm32f407vg.blinky/images/stm_configuration.png diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/images/stm_preview.jpg b/itemis.create.examples.stm32f407vg.blinky/images/stm_preview.jpg similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.blinky/images/stm_preview.jpg rename to itemis.create.examples.stm32f407vg.blinky/images/stm_preview.jpg diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/index.html b/itemis.create.examples.stm32f407vg.blinky/index.html similarity index 93% rename from com.yakindu.sct.examples.stm32f407vg.blinky/index.html rename to itemis.create.examples.stm32f407vg.blinky/index.html index be096811..21002f1e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/index.html +++ b/itemis.create.examples.stm32f407vg.blinky/index.html @@ -12,7 +12,7 @@

    [Pro] STM32F407 Discovery Board With Deep C Integration

    - This is an example for the integration of YAKINDU Statechart Tools with another IDE, here the STM32CubeIDE. + This is an example for the integration of Itemis CREATE with another IDE, here the STM32CubeIDE. The example model makes use of the deep C integration to directly call functions from the HAL headers in the statechart model:

    @@ -29,7 +29,7 @@

    Getting started

    required. You can find it HERE.

    - After downloading and installing the STM32CubeIDE, YAKINDU Statechart Tools Professional Edition must + After downloading and installing the STM32CubeIDE, Itemis CREATE Professional Edition must installed via the update site. You can follow these STEPS. diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/metadata.json b/itemis.create.examples.stm32f407vg.blinky/metadata.json similarity index 85% rename from com.yakindu.sct.examples.stm32f407vg.blinky/metadata.json rename to itemis.create.examples.stm32f407vg.blinky/metadata.json index df5c2096..f9b4d344 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/metadata.json +++ b/itemis.create.examples.stm32f407vg.blinky/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.stm32f407vg.blinky", + "id": "itemis.create.examples.stm32f407vg.blinky", "title": "STM32F407 Discovery - Blinky LED (Deep C)", "author": "itemis AG", "description": "This is a simple example of how to use the C domain together with an STM32F407 Discovery board. C timers are integrated.", diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/model/blinky.ysc b/itemis.create.examples.stm32f407vg.blinky/model/blinky.ysc similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/model/blinky.ysc rename to itemis.create.examples.stm32f407vg.blinky/model/blinky.ysc index 29917e08..a2c45da4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/model/blinky.ysc +++ b/itemis.create.examples.stm32f407vg.blinky/model/blinky.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/model/generator.sgen b/itemis.create.examples.stm32f407vg.blinky/model/generator.sgen similarity index 60% rename from com.yakindu.sct.examples.stm32f407vg.blinky/model/generator.sgen rename to itemis.create.examples.stm32f407vg.blinky/model/generator.sgen index fdc78556..9defac96 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/model/generator.sgen +++ b/itemis.create.examples.stm32f407vg.blinky/model/generator.sgen @@ -1,9 +1,9 @@ -GeneratorModel for yakindu::c { +GeneratorModel for create::c { statechart blinky { feature Outlet { - targetProject = "com.yakindu.sct.examples.stm32f407vg.blinky" + targetProject = "itemis.create.examples.stm32f407vg.blinky" targetFolder = "Core/Src" libraryTargetFolder = "Core/Inc" apiTargetFolder = "Core/Inc" diff --git a/itemis.create.examples.stm32f407vg.multism.blinky/.cproject b/itemis.create.examples.stm32f407vg.multism.blinky/.cproject new file mode 100644 index 00000000..3b89f80f --- /dev/null +++ b/itemis.create.examples.stm32f407vg.multism.blinky/.cproject @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/.gitignore b/itemis.create.examples.stm32f407vg.multism.blinky/.gitignore similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/.gitignore rename to itemis.create.examples.stm32f407vg.multism.blinky/.gitignore diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/.project b/itemis.create.examples.stm32f407vg.multism.blinky/.project similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/.project rename to itemis.create.examples.stm32f407vg.multism.blinky/.project index 2130779d..9675be94 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/.project +++ b/itemis.create.examples.stm32f407vg.multism.blinky/.project @@ -1,6 +1,6 @@ - com.yakindu.sct.examples.stm32f407vg.multism.blinky + itemis.create.examples.stm32f407vg.multism.blinky diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/main.h b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/main.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/main.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/main.h index 82c92a30..fe94005c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/main.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/main.h @@ -1,71 +1,71 @@ -/* 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) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ -#define SCT_MAIN 1 -/* 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 -----------------------------------------------------------*/ -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* 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) 2020 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ +#define SCT_MAIN 1 +/* 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 -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h index b883deea..45789ebc 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/sc_timer_service.h @@ -14,7 +14,7 @@ extern "C" { #endif -/*! file/ Interface definition of a POSIX thread based timer service for YAKINDU SCT state machines. */ +/*! file/ Interface definition of a POSIX thread based timer service for CREATE SCT state machines. */ struct sc_timer_service; diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h index 92eb28d2..6b705a32 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_hal_conf.h @@ -1,443 +1,443 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED - - /* #define HAL_ADC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CRC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -/* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -/* #define HAL_I2C_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ -/* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)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 ((uint32_t)0x000000FFU) -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) - -#define PHY_READ_TO ((uint32_t)0x0000FFFFU) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)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 "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPI_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)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 ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)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 "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h index bb403d38..af3abce1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Inc/stm32f4xx_it.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Inc/stm32f4xx_it.h @@ -1,70 +1,70 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void TIM5_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void TIM5_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/main.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/main.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/main.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/main.c index acf248e6..b6b19450 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/main.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/main.c @@ -1,294 +1,294 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include "Controller_required.h" -#include "LED.h" -#include "sc_timer_service.h" - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ -#define MAX_TIMERS 20 -#define TICK_MS 1 -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim5; - -/* USER CODE BEGIN PV */ -Controller sm; -LED green; -LED orange; -LED red; -LED blue; - -static sc_timer_t timers[MAX_TIMERS]; -static sc_timer_service_t timer_service; - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_TIM5_Init(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - /* USER CODE BEGIN 1 */ - - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_TIM5_Init(); - /* USER CODE BEGIN 2 */ - HAL_TIM_Base_Start_IT(&htim5); - sc_timer_service_init(&timer_service, timers, MAX_TIMERS, (sc_raise_time_event_fp) &controller_raise_time_event); - - lED_init(&green); - lED_init(&orange); - lED_init(&red); - lED_init(&blue); - - controller_init(&sm); - - controller_set_green(&sm, &green); - controller_set_orange(&sm, &orange); - controller_set_red(&sm, &red); - controller_set_blue(&sm, &blue); - - controller_enter(&sm); - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - - /** Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - /** Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 4; - RCC_OscInitStruct.PLL.PLLN = 168; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - /** Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) - { - Error_Handler(); - } -} - -/** - * @brief TIM5 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM5_Init(void) -{ - - /* USER CODE BEGIN TIM5_Init 0 */ - - /* USER CODE END TIM5_Init 0 */ - - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - - /* USER CODE BEGIN TIM5_Init 1 */ - - /* USER CODE END TIM5_Init 1 */ - htim5.Instance = TIM5; - htim5.Init.Prescaler = 1; - htim5.Init.CounterMode = TIM_COUNTERMODE_UP; - htim5.Init.Period = 41999; - htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim5) != HAL_OK) - { - Error_Handler(); - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) - { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN TIM5_Init 2 */ - - /* USER CODE END TIM5_Init 2 */ - -} - -/** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); - - /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ - GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - -} - -/* USER CODE BEGIN 4 */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { - if(htim->Instance == htim5.Instance) { - sc_timer_service_proceed(&timer_service, TICK_MS); - } -} - -void controller_set_timer(Controller* handle, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic){ - sc_timer_start(&timer_service, (void*) handle, evid, time_ms, periodic); -} -void controller_unset_timer(Controller* handle, const sc_eventid evid){ - sc_timer_cancel(&timer_service, evid); - (void) handle; -} - - -/* 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 */ - - /* 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, - tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "Controller_required.h" +#include "LED.h" +#include "sc_timer_service.h" + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ +#define MAX_TIMERS 20 +#define TICK_MS 1 +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim5; + +/* USER CODE BEGIN PV */ +Controller sm; +LED green; +LED orange; +LED red; +LED blue; + +static sc_timer_t timers[MAX_TIMERS]; +static sc_timer_service_t timer_service; + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_TIM5_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_TIM5_Init(); + /* USER CODE BEGIN 2 */ + HAL_TIM_Base_Start_IT(&htim5); + sc_timer_service_init(&timer_service, timers, MAX_TIMERS, (sc_raise_time_event_fp) &controller_raise_time_event); + + lED_init(&green); + lED_init(&orange); + lED_init(&red); + lED_init(&blue); + + controller_init(&sm); + + controller_set_green(&sm, &green); + controller_set_orange(&sm, &orange); + controller_set_red(&sm, &red); + controller_set_blue(&sm, &blue); + + controller_enter(&sm); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief TIM5 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM5_Init(void) +{ + + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 1; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 41999; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); + + /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { + if(htim->Instance == htim5.Instance) { + sc_timer_service_proceed(&timer_service, TICK_MS); + } +} + +void controller_set_timer(Controller* handle, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic){ + sc_timer_start(&timer_service, (void*) handle, evid, time_ms, periodic); +} +void controller_unset_timer(Controller* handle, const sc_eventid evid){ + sc_timer_cancel(&timer_service, evid); + (void) handle; +} + + +/* 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 */ + + /* 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, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c index 21fe894f..9efbd385 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/sc_timer_service.c @@ -10,7 +10,7 @@ #include "sc_timer_service.h" -/*! \file Implementation of YAKINDU SCT timer functionality based on POSIX threads. */ +/*! \file Implementation of CREATE SCT timer functionality based on POSIX threads. */ /*! Callback that is called when a timer fires. */ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c index 85a0961d..af7dd713 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/stm32f4xx_hal_msp.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_hal_msp.c @@ -1,134 +1,134 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : stm32f4xx_hal_msp.c - * Description : This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** -* @brief TIM_Base MSP Initialization -* This function configures the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - /* TIM5 interrupt Init */ - HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TIM5_IRQn); - /* USER CODE BEGIN TIM5_MspInit 1 */ - - /* USER CODE END TIM5_MspInit 1 */ - } - -} - -/** -* @brief TIM_Base MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param htim_base: TIM_Base handle pointer -* @retval None -*/ -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) -{ - if(htim_base->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspDeInit 0 */ - - /* USER CODE END TIM5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM5_CLK_DISABLE(); - - /* TIM5 interrupt DeInit */ - HAL_NVIC_DisableIRQ(TIM5_IRQn); - /* USER CODE BEGIN TIM5_MspDeInit 1 */ - - /* USER CODE END TIM5_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* TIM5 interrupt Init */ + HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM5_IRQn); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + + /* TIM5 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM5_IRQn); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c index f91f1a64..6860c149 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/stm32f4xx_it.c @@ -1,217 +1,217 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32f4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern TIM_HandleTypeDef htim5; -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Pre-fetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles TIM5 global interrupt. - */ -void TIM5_IRQHandler(void) -{ - /* USER CODE BEGIN TIM5_IRQn 0 */ - - /* USER CODE END TIM5_IRQn 0 */ - HAL_TIM_IRQHandler(&htim5); - /* USER CODE BEGIN TIM5_IRQn 1 */ - - /* USER CODE END TIM5_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim5; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles TIM5 global interrupt. + */ +void TIM5_IRQHandler(void) +{ + /* USER CODE BEGIN TIM5_IRQn 0 */ + + /* USER CODE END TIM5_IRQn 0 */ + HAL_TIM_IRQHandler(&htim5); + /* USER CODE BEGIN TIM5_IRQn 1 */ + + /* USER CODE END TIM5_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/syscalls.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/syscalls.c similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/syscalls.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/syscalls.c diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/sysmem.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/sysmem.c similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Core/Src/sysmem.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/sysmem.c diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c index a9cfc960..bcb2b9f4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Src/system_stm32f4xx.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Src/system_stm32f4xx.c @@ -1,727 +1,727 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ - STM32F412Zx || STM32F412Vx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 16000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ - RCC->AHB1ENR |= 0x000001F8; - - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ - FMC_Bank5_6->SDCMR = 0x00000073; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ - FMC_Bank5_6->SDCMR = 0x00046014; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ - - (void)(tmp); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s rename to itemis.create.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s index e26b978b..c851be96 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Core/Startup/startup_stm32f407vgtx.s +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Core/Startup/startup_stm32f407vgtx.s @@ -1,505 +1,505 @@ -/** - ****************************************************************************** - * @file startup_stm32f407xx.s - * @author MCD Application Team - * @brief STM32F407xx Devices vector table for GCC based toolchains. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m4 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - ldr sp, =_estack /* set stack pointer */ - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* 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 - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word 0 /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author MCD Application Team + * @brief STM32F407xx Devices vector table for GCC based toolchains. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* 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 + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h index 08e4f53d..7a2e5bb9 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h @@ -1,15594 +1,15594 @@ -/** - ****************************************************************************** - * @file stm32f407xx.h - * @author MCD Application Team - * @brief CMSIS STM32F407xx Device Peripheral Access Layer Header File. - * - * This file contains: - * - Data structures and the address mapping for all peripherals - * - peripherals registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS_Device - * @{ - */ - -/** @addtogroup stm32f407xx - * @{ - */ - -#ifndef __STM32F407xx_H -#define __STM32F407xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ -#define __FPU_PRESENT 1U /*!< FPU present */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - RNG_IRQn = 80, /*!< RNG global Interrupt */ - FPU_IRQn = 81 /*!< FPU global interrupt */ -} IRQn_Type; -/* Legacy define */ -#define HASH_RNG_IRQn RNG_IRQn - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1; - __IO uint32_t MACDBGR; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ - __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ -} FLASH_TypeDef; - - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @brief USB_OTG_Core_Registers - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ - __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ - uint32_t Reserved30[2]; /*!< Reserved 030h */ - __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ - __IO uint32_t CID; /*!< User ID Register 03Ch */ - uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ - __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ - __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ -} USB_OTG_GlobalTypeDef; - -/** - * @brief USB_OTG_device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ - __IO uint32_t DCTL; /*!< dev Control Register 804h */ - __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ - uint32_t Reserved0C; /*!< Reserved 80Ch */ - __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ - __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ - __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ - __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ - uint32_t Reserved20; /*!< Reserved 820h */ - uint32_t Reserved9; /*!< Reserved 824h */ - __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ - __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ - __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ - __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ - __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ - __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ - uint32_t Reserved40; /*!< dedicated EP mask 840h */ - __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ - uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ - __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ -} USB_OTG_DeviceTypeDef; - -/** - * @brief USB_OTG_IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ - __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ - __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ - __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ - uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ -} USB_OTG_INEndpointTypeDef; - -/** - * @brief USB_OTG_OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ - uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ - __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ - uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ - __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ - __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ - uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ -} USB_OTG_OUTEndpointTypeDef; - -/** - * @brief USB_OTG_Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ - __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ - __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ - uint32_t Reserved40C; /*!< Reserved 40Ch */ - __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ - __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ - __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ -} USB_OTG_HostTypeDef; - -/** - * @brief USB_OTG_Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ - __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ - __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ - __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ - __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ - __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ - uint32_t Reserved[2]; /*!< Reserved */ -} USB_OTG_HostChannelTypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ -#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ -#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ -#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ -#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ -#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) -#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) -/* Legacy define */ -#define ADC_BASE ADC123_COMMON_BASE -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) -#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) -#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) - - -/*!< Debug MCU registers base address */ -#define DBGMCU_BASE 0xE0042000UL -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE 0x40040000UL -#define USB_OTG_FS_PERIPH_BASE 0x50000000UL - -#define USB_OTG_GLOBAL_BASE 0x000UL -#define USB_OTG_DEVICE_BASE 0x800UL -#define USB_OTG_IN_ENDPOINT_BASE 0x900UL -#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL -#define USB_OTG_EP_REG_SIZE 0x20UL -#define USB_OTG_HOST_BASE 0x400UL -#define USB_OTG_HOST_PORT_BASE 0x440UL -#define USB_OTG_HOST_CHANNEL_BASE 0x500UL -#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL -#define USB_OTG_PCGCCTL_BASE 0xE00UL -#define USB_OTG_FIFO_BASE 0x1000UL -#define USB_OTG_FIFO_SIZE 0x1000UL - -#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ -#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ -#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC1 ((DAC_TypeDef *) DAC_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) -/* Legacy define */ -#define ADC ADC123_COMMON -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) - */ -#define ADC_MULTIMODE_SUPPORT /*!
    © Copyright (c) 2017 STMicroelectronics. + * All rights reserved.
    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f407xx + * @{ + */ + +#ifndef __STM32F407xx_H +#define __STM32F407xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M4 Processor and Core Peripherals + */ +#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1U /*!< FPU present */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F4XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + DCMI_IRQn = 78, /*!< DCMI global interrupt */ + RNG_IRQn = 80, /*!< RNG global Interrupt */ + FPU_IRQn = 81 /*!< FPU global interrupt */ +} IRQn_Type; +/* Legacy define */ +#define HASH_RNG_IRQn RNG_IRQn + +/** + * @} + */ + +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "system_stm32f4xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + +/** + * @brief DCMI + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ + __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ + __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ + __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ + __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ + __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ + __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ + __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ + __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ + __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ +} DCMI_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1; + __IO uint32_t MACDBGR; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RESERVED8; + __IO uint32_t PTPTSSR; + uint32_t RESERVED9[565]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARSWTR; + uint32_t RESERVED10[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ + __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ +} FLASH_TypeDef; + + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + +/** + * @brief USB_OTG_Core_Registers + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ + __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ + __IO uint32_t CID; /*!< User ID Register 03Ch */ + uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} USB_OTG_GlobalTypeDef; + +/** + * @brief USB_OTG_device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ + __IO uint32_t DCTL; /*!< dev Control Register 804h */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved9; /*!< Reserved 824h */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ + uint32_t Reserved40; /*!< dedicated EP mask 840h */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ + uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ +} USB_OTG_DeviceTypeDef; + +/** + * @brief USB_OTG_IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} USB_OTG_INEndpointTypeDef; + +/** + * @brief USB_OTG_OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ + __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ + __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ + uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ +} USB_OTG_OUTEndpointTypeDef; + +/** + * @brief USB_OTG_Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ + __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ + __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ + __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ + __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ +} USB_OTG_HostTypeDef; + +/** + * @brief USB_OTG_Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ + __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ + __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ + __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ + __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ + __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ + uint32_t Reserved[2]; /*!< Reserved */ +} USB_OTG_HostChannelTypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) +#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) +#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) +#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + + +/*!< Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ +#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.
    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx - * @{ - */ - -#ifndef __STM32F4xx_H -#define __STM32F4xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/** - * @brief STM32 Family - */ -#if !defined (STM32F4) -#define STM32F4 -#endif /* STM32F4 */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ -#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \ - !defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \ - !defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \ - !defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \ - !defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \ - !defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) - /* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ - /* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ - /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ - /* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ - /* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ - /* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ - /* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, - STM32F439NI, STM32F429IG and STM32F429II Devices */ - /* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, - STM32F439NI, STM32F439IG and STM32F439II Devices */ - /* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ - /* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ - /* #define STM32F410Tx */ /*!< STM32F410T8 and STM32F410TB Devices */ - /* #define STM32F410Cx */ /*!< STM32F410C8 and STM32F410CB Devices */ - /* #define STM32F410Rx */ /*!< STM32F410R8 and STM32F410RB Devices */ - /* #define STM32F411xE */ /*!< STM32F411CC, STM32F411RC, STM32F411VC, STM32F411CE, STM32F411RE and STM32F411VE Devices */ - /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC, - and STM32F446ZE Devices */ - /* #define STM32F469xx */ /*!< STM32F469AI, STM32F469II, STM32F469BI, STM32F469NI, STM32F469AG, STM32F469IG, STM32F469BG, - STM32F469NG, STM32F469AE, STM32F469IE, STM32F469BE and STM32F469NE Devices */ - /* #define STM32F479xx */ /*!< STM32F479AI, STM32F479II, STM32F479BI, STM32F479NI, STM32F479AG, STM32F479IG, STM32F479BG - and STM32F479NG Devices */ - /* #define STM32F412Cx */ /*!< STM32F412CEU and STM32F412CGU Devices */ - /* #define STM32F412Zx */ /*!< STM32F412ZET, STM32F412ZGT, STM32F412ZEJ and STM32F412ZGJ Devices */ - /* #define STM32F412Vx */ /*!< STM32F412VET, STM32F412VGT, STM32F412VEH and STM32F412VGH Devices */ - /* #define STM32F412Rx */ /*!< STM32F412RET, STM32F412RGT, STM32F412REY and STM32F412RGY Devices */ - /* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG, - STM32F413RG, STM32F413VG and STM32F413ZG Devices */ - /* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */ -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ -#if !defined (USE_HAL_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_HAL_DRIVER */ -#endif /* USE_HAL_DRIVER */ - -/** - * @brief CMSIS version number V2.6.5 - */ -#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ -#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ - |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ - |(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ - |(__STM32F4xx_CMSIS_VERSION)) - -/** - * @} - */ - -/** @addtogroup Device_Included - * @{ - */ - -#if defined(STM32F405xx) - #include "stm32f405xx.h" -#elif defined(STM32F415xx) - #include "stm32f415xx.h" -#elif defined(STM32F407xx) - #include "stm32f407xx.h" -#elif defined(STM32F417xx) - #include "stm32f417xx.h" -#elif defined(STM32F427xx) - #include "stm32f427xx.h" -#elif defined(STM32F437xx) - #include "stm32f437xx.h" -#elif defined(STM32F429xx) - #include "stm32f429xx.h" -#elif defined(STM32F439xx) - #include "stm32f439xx.h" -#elif defined(STM32F401xC) - #include "stm32f401xc.h" -#elif defined(STM32F401xE) - #include "stm32f401xe.h" -#elif defined(STM32F410Tx) - #include "stm32f410tx.h" -#elif defined(STM32F410Cx) - #include "stm32f410cx.h" -#elif defined(STM32F410Rx) - #include "stm32f410rx.h" -#elif defined(STM32F411xE) - #include "stm32f411xe.h" -#elif defined(STM32F446xx) - #include "stm32f446xx.h" -#elif defined(STM32F469xx) - #include "stm32f469xx.h" -#elif defined(STM32F479xx) - #include "stm32f479xx.h" -#elif defined(STM32F412Cx) - #include "stm32f412cx.h" -#elif defined(STM32F412Zx) - #include "stm32f412zx.h" -#elif defined(STM32F412Rx) - #include "stm32f412rx.h" -#elif defined(STM32F412Vx) - #include "stm32f412vx.h" -#elif defined(STM32F413xx) - #include "stm32f413xx.h" -#elif defined(STM32F423xx) - #include "stm32f423xx.h" -#else - #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" -#endif - -/** - * @} - */ - -/** @addtogroup Exported_types - * @{ - */ -typedef enum -{ - RESET = 0U, - SET = !RESET -} FlagStatus, ITStatus; - -typedef enum -{ - DISABLE = 0U, - ENABLE = !DISABLE -} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum -{ - SUCCESS = 0U, - ERROR = !SUCCESS -} ErrorStatus; - -/** - * @} - */ - - -/** @addtogroup Exported_macro - * @{ - */ -#define SET_BIT(REG, BIT) ((REG) |= (BIT)) - -#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) - -#define READ_BIT(REG, BIT) ((REG) & (BIT)) - -#define CLEAR_REG(REG) ((REG) = (0x0)) - -#define WRITE_REG(REG, VAL) ((REG) = (VAL)) - -#define READ_REG(REG) ((REG)) - -#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) - -#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) - - -/** - * @} - */ - -#if defined (USE_HAL_DRIVER) - #include "stm32f4xx_hal.h" -#endif /* USE_HAL_DRIVER */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __STM32F4xx_H */ -/** - * @} - */ - -/** - * @} - */ - - - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx.h + * @author MCD Application Team + * @brief CMSIS STM32F4xx Device Peripheral Access Layer Header File. + * + * The file is the unique include file that the application programmer + * is using in the C source code, usually in main.c. This file contains: + * - Configuration section that allows to select: + * - The STM32F4xx device used in the target application + * - To use or not the peripheral’s drivers in application code(i.e. + * code will be based on direct access to peripheral’s registers + * rather than drivers API), this option is controlled by + * "#define USE_HAL_DRIVER" + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx + * @{ + */ + +#ifndef __STM32F4xx_H +#define __STM32F4xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Library_configuration_section + * @{ + */ + +/** + * @brief STM32 Family + */ +#if !defined (STM32F4) +#define STM32F4 +#endif /* STM32F4 */ + +/* Uncomment the line below according to the target STM32 device used in your + application + */ +#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \ + !defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \ + !defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \ + !defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \ + !defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \ + !defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) + /* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ + /* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ + /* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ + /* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ + /* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ + /* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ + /* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, + STM32F439NI, STM32F429IG and STM32F429II Devices */ + /* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, + STM32F439NI, STM32F439IG and STM32F439II Devices */ + /* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ + /* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ + /* #define STM32F410Tx */ /*!< STM32F410T8 and STM32F410TB Devices */ + /* #define STM32F410Cx */ /*!< STM32F410C8 and STM32F410CB Devices */ + /* #define STM32F410Rx */ /*!< STM32F410R8 and STM32F410RB Devices */ + /* #define STM32F411xE */ /*!< STM32F411CC, STM32F411RC, STM32F411VC, STM32F411CE, STM32F411RE and STM32F411VE Devices */ + /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC, + and STM32F446ZE Devices */ + /* #define STM32F469xx */ /*!< STM32F469AI, STM32F469II, STM32F469BI, STM32F469NI, STM32F469AG, STM32F469IG, STM32F469BG, + STM32F469NG, STM32F469AE, STM32F469IE, STM32F469BE and STM32F469NE Devices */ + /* #define STM32F479xx */ /*!< STM32F479AI, STM32F479II, STM32F479BI, STM32F479NI, STM32F479AG, STM32F479IG, STM32F479BG + and STM32F479NG Devices */ + /* #define STM32F412Cx */ /*!< STM32F412CEU and STM32F412CGU Devices */ + /* #define STM32F412Zx */ /*!< STM32F412ZET, STM32F412ZGT, STM32F412ZEJ and STM32F412ZGJ Devices */ + /* #define STM32F412Vx */ /*!< STM32F412VET, STM32F412VGT, STM32F412VEH and STM32F412VGH Devices */ + /* #define STM32F412Rx */ /*!< STM32F412RET, STM32F412RGT, STM32F412REY and STM32F412RGY Devices */ + /* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG, + STM32F413RG, STM32F413VG and STM32F413ZG Devices */ + /* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */ +#endif + +/* Tip: To avoid modifying this file each time you need to switch between these + devices, you can define the device in your toolchain compiler preprocessor. + */ +#if !defined (USE_HAL_DRIVER) +/** + * @brief Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ + /*#define USE_HAL_DRIVER */ +#endif /* USE_HAL_DRIVER */ + +/** + * @brief CMSIS version number V2.6.5 + */ +#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ +#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ + |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ + |(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ + |(__STM32F4xx_CMSIS_VERSION)) + +/** + * @} + */ + +/** @addtogroup Device_Included + * @{ + */ + +#if defined(STM32F405xx) + #include "stm32f405xx.h" +#elif defined(STM32F415xx) + #include "stm32f415xx.h" +#elif defined(STM32F407xx) + #include "stm32f407xx.h" +#elif defined(STM32F417xx) + #include "stm32f417xx.h" +#elif defined(STM32F427xx) + #include "stm32f427xx.h" +#elif defined(STM32F437xx) + #include "stm32f437xx.h" +#elif defined(STM32F429xx) + #include "stm32f429xx.h" +#elif defined(STM32F439xx) + #include "stm32f439xx.h" +#elif defined(STM32F401xC) + #include "stm32f401xc.h" +#elif defined(STM32F401xE) + #include "stm32f401xe.h" +#elif defined(STM32F410Tx) + #include "stm32f410tx.h" +#elif defined(STM32F410Cx) + #include "stm32f410cx.h" +#elif defined(STM32F410Rx) + #include "stm32f410rx.h" +#elif defined(STM32F411xE) + #include "stm32f411xe.h" +#elif defined(STM32F446xx) + #include "stm32f446xx.h" +#elif defined(STM32F469xx) + #include "stm32f469xx.h" +#elif defined(STM32F479xx) + #include "stm32f479xx.h" +#elif defined(STM32F412Cx) + #include "stm32f412cx.h" +#elif defined(STM32F412Zx) + #include "stm32f412zx.h" +#elif defined(STM32F412Rx) + #include "stm32f412rx.h" +#elif defined(STM32F412Vx) + #include "stm32f412vx.h" +#elif defined(STM32F413xx) + #include "stm32f413xx.h" +#elif defined(STM32F423xx) + #include "stm32f423xx.h" +#else + #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" +#endif + +/** + * @} + */ + +/** @addtogroup Exported_types + * @{ + */ +typedef enum +{ + RESET = 0U, + SET = !RESET +} FlagStatus, ITStatus; + +typedef enum +{ + DISABLE = 0U, + ENABLE = !DISABLE +} FunctionalState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum +{ + SUCCESS = 0U, + ERROR = !SUCCESS +} ErrorStatus; + +/** + * @} + */ + + +/** @addtogroup Exported_macro + * @{ + */ +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) + +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) + +#define READ_BIT(REG, BIT) ((REG) & (BIT)) + +#define CLEAR_REG(REG) ((REG) = (0x0)) + +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) + +#define READ_REG(REG) ((REG)) + +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) + + +/** + * @} + */ + +#if defined (USE_HAL_DRIVER) + #include "stm32f4xx_hal.h" +#endif /* USE_HAL_DRIVER */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __STM32F4xx_H */ +/** + * @} + */ + +/** + * @} + */ + + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h index 8087ba45..99cb936c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h @@ -1,122 +1,122 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.h - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. - ****************************************************************************** - * @attention - * - *

    © COPYRIGHT(c) 2017 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. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** - * @brief Define to prevent recursive inclusion - */ -#ifndef __SYSTEM_STM32F4XX_H -#define __SYSTEM_STM32F4XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup STM32F4xx_System_Includes - * @{ - */ - -/** - * @} - */ - - -/** @addtogroup STM32F4xx_System_Exported_types - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetSysClockFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - -extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ -extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Functions - * @{ - */ - -extern void SystemInit(void); -extern void SystemCoreClockUpdate(void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__SYSTEM_STM32F4XX_H */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f4xx.h + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. + ****************************************************************************** + * @attention + * + *

    © COPYRIGHT(c) 2017 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** + * @brief Define to prevent recursive inclusion + */ +#ifndef __SYSTEM_STM32F4XX_H +#define __SYSTEM_STM32F4XX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32F4xx_System_Includes + * @{ + */ + +/** + * @} + */ + + +/** @addtogroup STM32F4xx_System_Exported_types + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetSysClockFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ +extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Constants + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Exported_Functions + * @{ + */ + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_STM32F4XX_H */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h index 7d751fb3..4d9d0645 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armcc.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armcc.h @@ -1,865 +1,865 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.0.4 - * @date 10. January 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use Arm Compiler Toolchain V4.0.677 or later!" -#endif - -/* CMSIS compiler control architecture macros */ -#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ - (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 -#endif - -#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 -#endif - - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ - - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE static __forceinline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed)) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION __packed union -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#else - (void)fpscr; -#endif -} - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() do {\ - __schedule_barrier();\ - __isb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() do {\ - __schedule_barrier();\ - __dsb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() do {\ - __schedule_barrier();\ - __dmb(0xF);\ - __schedule_barrier();\ - } while (0U) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return result; -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h index d8031b03..162a400e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_armclang.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_armclang.h @@ -1,1869 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h index 79a2cac3..94212eb8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_compiler.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_compiler.h @@ -1,266 +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 */ - +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h index 1bd41a49..2d9db15a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_gcc.h @@ -1,2085 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h index 3c90a2cd..11c4af0e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -1,935 +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__ */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h index ae3f2e33..660f612a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/cmsis_version.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/cmsis_version.h @@ -1,39 +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 +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h index ec76ab21..251e4ede 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_armv8mbl.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mbl.h @@ -1,1918 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h index 2d0f1067..3a3148ea 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_armv8mml.h @@ -1,2927 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h index 6f82227c..f929bba0 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0.h @@ -1,949 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h index b9377e8c..424011ac 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm0plus.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm0plus.h @@ -1,1083 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h index fd1c4077..0ed678e3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm1.h @@ -1,976 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h index 8202a8dd..acbc5dfe 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm23.h @@ -1,1993 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h index b0dfbd3d..74bff64b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm3.h @@ -1,1941 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h index 02f82e29..6cd2db77 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm33.h @@ -1,3002 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h index 308b8681..7d568735 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_cm4.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm4.h @@ -1,2129 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h index ada6c2a5..a14dc623 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_cm7.h @@ -1,2671 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h index 9086c642..9b67c92f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/CMSIS/Include/core_sc000.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc000.h @@ -1,1022 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h index 665822da..3e8a4710 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/core_sc300.h @@ -1,1915 +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 */ +/**************************************************************************//** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h index 7d4b600c..01422033 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv7.h @@ -1,270 +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 +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h index 99ee9f99..62571da5 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/mpu_armv8.h @@ -1,333 +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 - +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h index d4c1474f..0d09749f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/CMSIS/Include/tz_context.h @@ -1,70 +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 +/****************************************************************************** + * @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/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 2d265fb6..90767ed3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -1,3776 +1,3776 @@ -/** - ****************************************************************************** - * @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) 2019 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef 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 - -/** - * @} - */ - -/** @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 */ -/** - * @} - */ - -/** @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 -/** - * @} - */ - -/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose - * @{ - */ -#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig -/** - * @} - */ - -/** @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) -#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL -#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL -#endif - -#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) -#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 -#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 */ - -/** - * @} - */ - -/** @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 -#define PAGESIZE FLASH_PAGE_SIZE -#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) -#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 */ - -/** - * @} - */ - -/** @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 */ -/** - * @} - */ - - -/** @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) -#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*/ - -#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 -/** - * @} - */ - -/** @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 -#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 events that can be selected to configure the - * set/reset crossbar of a timer output - */ -#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) -#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) -#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) -#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) -#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) -#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) -#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) -#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) -#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) - -#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) -#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) -#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) -#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) -#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) -#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) -#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) -#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) -#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) - -/** @brief Constants defining the event filtering applied to external events - * by a timer - */ -#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) -#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) -#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) -#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_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_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) -#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 - - -/** - * @} - */ - -/** @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(STM32H7) -#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X -#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT - -#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_TAMPALL -#endif /* STM32H7 */ - -/** - * @} - */ - - -/** @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 - -/** - * @} - */ - -/** @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 */ - -/** - * @} - */ - -/** @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 */ - -/** @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_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(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 || 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) -#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 */ -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) -#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 */ - -#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 - - /** - * @} - */ - -/** @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 -#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 -#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(STM32L4) -#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) -#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 -#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 -#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 - -#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 - -/** - * @} - */ - -/** @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) -#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 */ - -#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 - -/** - * @} - */ - -/** @defgroup HAL_SD_Aliased_Macros HAL SD 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(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 - -/** - * @} - */ - -/** @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 -/** - * @} - */ - -/** @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) -#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE -#endif /* STM32L4 || STM32F4 || STM32F7 */ -/** - * @} - */ - -/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32_HAL_LEGACY */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - +/** + ****************************************************************************** + * @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) 2019 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef 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 + +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + +/** @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 +/** + * @} + */ + +/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose + * @{ + */ +#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig +/** + * @} + */ + +/** @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) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#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 +#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 */ + +/** + * @} + */ + +/** @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 +#define PAGESIZE FLASH_PAGE_SIZE +#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) +#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 */ + +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + + +/** @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) +#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*/ + +#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 +/** + * @} + */ + +/** @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 +#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 events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_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_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) +#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 + + +/** + * @} + */ + +/** @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(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#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_TAMPALL +#endif /* STM32H7 */ + +/** + * @} + */ + + +/** @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 + +/** + * @} + */ + +/** @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 */ + +/** + * @} + */ + +/** @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 */ + +/** @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_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(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 || 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) +#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 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) +#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 */ + +#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 + + /** + * @} + */ + +/** @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 +#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 +#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(STM32L4) +#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) +#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 +#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 +#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 + +#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 + +/** + * @} + */ + +/** @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) +#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 */ + +#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 + +/** + * @} + */ + +/** @defgroup HAL_SD_Aliased_Macros HAL SD 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(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 + +/** + * @} + */ + +/** @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 +/** + * @} + */ + +/** @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) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32_HAL_LEGACY */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h index 53bc3478..209864d5 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -1,298 +1,298 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the HAL - * module driver. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_H -#define __STM32F4xx_HAL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_conf.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup HAL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Constants HAL Exported Constants - * @{ - */ - -/** @defgroup HAL_TICK_FREQ Tick Frequency - * @{ - */ -typedef enum -{ - HAL_TICK_FREQ_10HZ = 100U, - HAL_TICK_FREQ_100HZ = 10U, - HAL_TICK_FREQ_1KHZ = 1U, - HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ -} HAL_TickFreqTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HAL_Exported_Macros HAL Exported Macros - * @{ - */ - -/** @brief Freeze/Unfreeze Peripherals in Debug mode - */ -#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) -#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) -#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) -#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) -#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) -#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) - -/** @brief Main Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) - -/** @brief System Flash memory mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ - }while(0); - -/** @brief Embedded SRAM mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ - }while(0); - -/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 - */ -#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ - SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ - }while(0); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable - * @{ - */ -/** @brief SYSCFG Break Lockup lock - * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ - }while(0) -/** - * @} - */ - -/** @defgroup PVD_Lock_Enable PVD Lock - * @{ - */ -/** @brief SYSCFG Break PVD lock - * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register - * @note The selected configuration is locked and can be unlocked by system reset - */ -#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ - SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ - }while(0) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup HAL_Private_Macros HAL Private Macros - * @{ - */ -#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ - ((FREQ) == HAL_TICK_FREQ_100HZ) || \ - ((FREQ) == HAL_TICK_FREQ_1KHZ)) -/** - * @} - */ - -/* Exported variables --------------------------------------------------------*/ - -/** @addtogroup HAL_Exported_Variables - * @{ - */ -extern __IO uint32_t uwTick; -extern uint32_t uwTickPrio; -extern HAL_TickFreqTypeDef uwTickFreq; -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HAL_Exported_Functions - * @{ - */ -/** @addtogroup HAL_Exported_Functions_Group1 - * @{ - */ -/* Initialization and Configuration functions ******************************/ -HAL_StatusTypeDef HAL_Init(void); -HAL_StatusTypeDef HAL_DeInit(void); -void HAL_MspInit(void); -void HAL_MspDeInit(void); -HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); -/** - * @} - */ - -/** @addtogroup HAL_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ************************************************/ -void HAL_IncTick(void); -void HAL_Delay(uint32_t Delay); -uint32_t HAL_GetTick(void); -uint32_t HAL_GetTickPrio(void); -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); -HAL_TickFreqTypeDef HAL_GetTickFreq(void); -void HAL_SuspendTick(void); -void HAL_ResumeTick(void); -uint32_t HAL_GetHalVersion(void); -uint32_t HAL_GetREVID(void); -uint32_t HAL_GetDEVID(void); -void HAL_DBGMCU_EnableDBGSleepMode(void); -void HAL_DBGMCU_DisableDBGSleepMode(void); -void HAL_DBGMCU_EnableDBGStopMode(void); -void HAL_DBGMCU_DisableDBGStopMode(void); -void HAL_DBGMCU_EnableDBGStandbyMode(void); -void HAL_DBGMCU_DisableDBGStandbyMode(void); -void HAL_EnableCompensationCell(void); -void HAL_DisableCompensationCell(void); -uint32_t HAL_GetUIDw0(void); -uint32_t HAL_GetUIDw1(void); -uint32_t HAL_GetUIDw2(void); -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -void HAL_EnableMemorySwappingBank(void); -void HAL_DisableMemorySwappingBank(void); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Variables HAL Private Variables - * @{ - */ -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HAL_Private_Constants HAL Private Constants - * @{ - */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal.h + * @author MCD Application Team + * @brief This file contains all the functions prototypes for the HAL + * module driver. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_H +#define __STM32F4xx_HAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_conf.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup HAL + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Constants HAL Exported Constants + * @{ + */ + +/** @defgroup HAL_TICK_FREQ Tick Frequency + * @{ + */ +typedef enum +{ + HAL_TICK_FREQ_10HZ = 100U, + HAL_TICK_FREQ_100HZ = 10U, + HAL_TICK_FREQ_1KHZ = 1U, + HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ +} HAL_TickFreqTypeDef; +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup HAL_Exported_Macros HAL Exported Macros + * @{ + */ + +/** @brief Freeze/Unfreeze Peripherals in Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +/** @brief Main Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) + +/** @brief System Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ + }while(0); + +/** @brief Embedded SRAM mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ + }while(0); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable + * @{ + */ +/** @brief SYSCFG Break Lockup lock + * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ + }while(0) +/** + * @} + */ + +/** @defgroup PVD_Lock_Enable PVD Lock + * @{ + */ +/** @brief SYSCFG Break PVD lock + * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ + }while(0) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup HAL_Private_Macros HAL Private Macros + * @{ + */ +#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ + ((FREQ) == HAL_TICK_FREQ_100HZ) || \ + ((FREQ) == HAL_TICK_FREQ_1KHZ)) +/** + * @} + */ + +/* Exported variables --------------------------------------------------------*/ + +/** @addtogroup HAL_Exported_Variables + * @{ + */ +extern __IO uint32_t uwTick; +extern uint32_t uwTickPrio; +extern HAL_TickFreqTypeDef uwTickFreq; +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup HAL_Exported_Functions + * @{ + */ +/** @addtogroup HAL_Exported_Functions_Group1 + * @{ + */ +/* Initialization and Configuration functions ******************************/ +HAL_StatusTypeDef HAL_Init(void); +HAL_StatusTypeDef HAL_DeInit(void); +void HAL_MspInit(void); +void HAL_MspDeInit(void); +HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); +/** + * @} + */ + +/** @addtogroup HAL_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ************************************************/ +void HAL_IncTick(void); +void HAL_Delay(uint32_t Delay); +uint32_t HAL_GetTick(void); +uint32_t HAL_GetTickPrio(void); +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); +HAL_TickFreqTypeDef HAL_GetTickFreq(void); +void HAL_SuspendTick(void); +void HAL_ResumeTick(void); +uint32_t HAL_GetHalVersion(void); +uint32_t HAL_GetREVID(void); +uint32_t HAL_GetDEVID(void); +void HAL_DBGMCU_EnableDBGSleepMode(void); +void HAL_DBGMCU_DisableDBGSleepMode(void); +void HAL_DBGMCU_EnableDBGStopMode(void); +void HAL_DBGMCU_DisableDBGStopMode(void); +void HAL_DBGMCU_EnableDBGStandbyMode(void); +void HAL_DBGMCU_DisableDBGStandbyMode(void); +void HAL_EnableCompensationCell(void); +void HAL_DisableCompensationCell(void); +uint32_t HAL_GetUIDw0(void); +uint32_t HAL_GetUIDw1(void); +uint32_t HAL_GetUIDw2(void); +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +void HAL_EnableMemorySwappingBank(void); +void HAL_DisableMemorySwappingBank(void); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Variables HAL Private Variables + * @{ + */ +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Constants HAL Private Constants + * @{ + */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h index e7b6e021..95218cfb 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h @@ -1,410 +1,410 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.h - * @author MCD Application Team - * @brief Header file of CORTEX HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CORTEX_H -#define __STM32F4xx_HAL_CORTEX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup CORTEX - * @{ - */ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CORTEX_Exported_Types Cortex Exported Types - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition - * @brief MPU Region initialization structure - * @{ - */ -typedef struct -{ - uint8_t Enable; /*!< Specifies the status of the region. - This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ - uint8_t Number; /*!< Specifies the number of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Number */ - uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ - uint8_t Size; /*!< Specifies the size of the region to protect. - This parameter can be a value of @ref CORTEX_MPU_Region_Size */ - uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint8_t TypeExtField; /*!< Specifies the TEX field level. - This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ - uint8_t AccessPermission; /*!< Specifies the region access permission type. - This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ - uint8_t DisableExec; /*!< Specifies the instruction access status. - This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ - uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ - uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. - This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ - uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. - This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ -}MPU_Region_InitTypeDef; -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants - * @{ - */ - -/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group - * @{ - */ -#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ -/** - * @} - */ - -/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source - * @{ - */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U -#define SYSTICK_CLKSOURCE_HCLK 0x00000004U - -/** - * @} - */ - -#if (__MPU_PRESENT == 1) -/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control - * @{ - */ -#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U -#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk -#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk -#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) - -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable - * @{ - */ -#define MPU_REGION_ENABLE ((uint8_t)0x01) -#define MPU_REGION_DISABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access - * @{ - */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable - * @{ - */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable - * @{ - */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable - * @{ - */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels - * @{ - */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size - * @{ - */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes - * @{ - */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) -/** - * @} - */ - -/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number - * @{ - */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07) -/** - * @} - */ -#endif /* __MPU_PRESENT */ - -/** - * @} - */ - - -/* Exported Macros -----------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup CORTEX_Exported_Functions - * @{ - */ - -/** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); -void HAL_NVIC_SystemReset(void); -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); -/** - * @} - */ - -/** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -uint32_t HAL_NVIC_GetPriorityGrouping(void); -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); -void HAL_SYSTICK_IRQHandler(void); -void HAL_SYSTICK_Callback(void); - -#if (__MPU_PRESENT == 1U) -void HAL_MPU_Enable(uint32_t MPU_Control); -void HAL_MPU_Disable(void); -void HAL_MPU_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 /* __STM32F4xx_HAL_CORTEX_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CORTEX_H +#define __STM32F4xx_HAL_CORTEX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup CORTEX + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup CORTEX_Exported_Types Cortex Exported Types + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition + * @brief MPU Region initialization structure + * @{ + */ +typedef struct +{ + uint8_t Enable; /*!< Specifies the status of the region. + This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ + uint8_t Number; /*!< Specifies the number of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Number */ + uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ + uint8_t Size; /*!< Specifies the size of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Size */ + uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint8_t TypeExtField; /*!< Specifies the TEX field level. + This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ + uint8_t AccessPermission; /*!< Specifies the region access permission type. + This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ + uint8_t DisableExec; /*!< Specifies the instruction access status. + This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ + uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ + uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. + This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ + uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ +}MPU_Region_InitTypeDef; +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group + * @{ + */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ +/** + * @} + */ + +/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source + * @{ + */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U + +/** + * @} + */ + +#if (__MPU_PRESENT == 1) +/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control + * @{ + */ +#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U +#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk +#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk +#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) + +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable + * @{ + */ +#define MPU_REGION_ENABLE ((uint8_t)0x01) +#define MPU_REGION_DISABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access + * @{ + */ +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable + * @{ + */ +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable + * @{ + */ +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable + * @{ + */ +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels + * @{ + */ +#define MPU_TEX_LEVEL0 ((uint8_t)0x00) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size + * @{ + */ +#define MPU_REGION_SIZE_32B ((uint8_t)0x04) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes + * @{ + */ +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number + * @{ + */ +#define MPU_REGION_NUMBER0 ((uint8_t)0x00) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07) +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + + +/* Exported Macros -----------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CORTEX_Exported_Functions + * @{ + */ + +/** @addtogroup CORTEX_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); +void HAL_NVIC_SystemReset(void); +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); +/** + * @} + */ + +/** @addtogroup CORTEX_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +uint32_t HAL_NVIC_GetPriorityGrouping(void); +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); +void HAL_SYSTICK_IRQHandler(void); +void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_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 /* __STM32F4xx_HAL_CORTEX_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h index 8004cb6e..e32e362d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h @@ -1,197 +1,197 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_def.h - * @author MCD Application Team - * @brief This file contains HAL common defines, enumeration, macros and - * structures definitions. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DEF -#define __STM32F4xx_HAL_DEF - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "Legacy/stm32_hal_legacy.h" -#include - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HAL Status structures definition - */ -typedef enum -{ - HAL_OK = 0x00U, - HAL_ERROR = 0x01U, - HAL_BUSY = 0x02U, - HAL_TIMEOUT = 0x03U -} HAL_StatusTypeDef; - -/** - * @brief HAL Lock structures definition - */ -typedef enum -{ - HAL_UNLOCKED = 0x00U, - HAL_LOCKED = 0x01U -} HAL_LockTypeDef; - -/* Exported macro ------------------------------------------------------------*/ - -#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ - -#define HAL_MAX_DELAY 0xFFFFFFFFU - -#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) -#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) - -#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ - do{ \ - (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ - (__DMA_HANDLE__).Parent = (__HANDLE__); \ - } while(0U) - -/** @brief Reset the Handle's State field. - * @param __HANDLE__ specifies the Peripheral Handle. - * @note This macro can be used for the following purpose: - * - When the Handle is declared as local variable; before passing it as parameter - * to HAL_PPP_Init() for the first time, it is mandatory to use this macro - * to set to 0 the Handle's "State" field. - * Otherwise, "State" field may have any random value and the first time the function - * HAL_PPP_Init() is called, the low level hardware initialization will be missed - * (i.e. HAL_PPP_MspInit() will not be executed). - * - When there is a need to reconfigure the low level hardware: instead of calling - * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). - * In this later function, when the Handle's "State" field is set to 0, it will execute the function - * HAL_PPP_MspInit() which will reconfigure the low level hardware. - * @retval None - */ -#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) - -#if (USE_RTOS == 1U) - /* Reserved for future use */ - #error "USE_RTOS should be 0 in the current HAL release" -#else - #define __HAL_LOCK(__HANDLE__) \ - do{ \ - if((__HANDLE__)->Lock == HAL_LOCKED) \ - { \ - return HAL_BUSY; \ - } \ - else \ - { \ - (__HANDLE__)->Lock = HAL_LOCKED; \ - } \ - }while (0U) - - #define __HAL_UNLOCK(__HANDLE__) \ - do{ \ - (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0U) -#endif /* USE_RTOS */ - -#if defined ( __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 ( __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 */ -#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 ) -/* ARM Compiler - ------------ - 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 ( __GNUC__ ) -/* ARM & GNUCompiler - ---------------- -*/ -#define __NOINLINE __attribute__ ( (noinline) ) - -#elif defined ( __ICCARM__ ) -/* ICCARM Compiler - --------------- -*/ -#define __NOINLINE _Pragma("optimize = no_inline") - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ___STM32F4xx_HAL_DEF */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_def.h + * @author MCD Application Team + * @brief This file contains HAL common defines, enumeration, macros and + * structures definitions. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DEF +#define __STM32F4xx_HAL_DEF + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" +#include "Legacy/stm32_hal_legacy.h" +#include + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief HAL Status structures definition + */ +typedef enum +{ + HAL_OK = 0x00U, + HAL_ERROR = 0x01U, + HAL_BUSY = 0x02U, + HAL_TIMEOUT = 0x03U +} HAL_StatusTypeDef; + +/** + * @brief HAL Lock structures definition + */ +typedef enum +{ + HAL_UNLOCKED = 0x00U, + HAL_LOCKED = 0x01U +} HAL_LockTypeDef; + +/* Exported macro ------------------------------------------------------------*/ + +#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ + +#define HAL_MAX_DELAY 0xFFFFFFFFU + +#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) +#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) + +#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ + do{ \ + (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ + (__DMA_HANDLE__).Parent = (__HANDLE__); \ + } while(0U) + +/** @brief Reset the Handle's State field. + * @param __HANDLE__ specifies the Peripheral Handle. + * @note This macro can be used for the following purpose: + * - When the Handle is declared as local variable; before passing it as parameter + * to HAL_PPP_Init() for the first time, it is mandatory to use this macro + * to set to 0 the Handle's "State" field. + * Otherwise, "State" field may have any random value and the first time the function + * HAL_PPP_Init() is called, the low level hardware initialization will be missed + * (i.e. HAL_PPP_MspInit() will not be executed). + * - When there is a need to reconfigure the low level hardware: instead of calling + * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). + * In this later function, when the Handle's "State" field is set to 0, it will execute the function + * HAL_PPP_MspInit() which will reconfigure the low level hardware. + * @retval None + */ +#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) + +#if (USE_RTOS == 1U) + /* Reserved for future use */ + #error "USE_RTOS should be 0 in the current HAL release" +#else + #define __HAL_LOCK(__HANDLE__) \ + do{ \ + if((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + }while (0U) + + #define __HAL_UNLOCK(__HANDLE__) \ + do{ \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + }while (0U) +#endif /* USE_RTOS */ + +#if defined ( __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 ( __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 */ +#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 ) +/* ARM Compiler + ------------ + 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 ( __GNUC__ ) +/* ARM & GNUCompiler + ---------------- +*/ +#define __NOINLINE __attribute__ ( (noinline) ) + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- +*/ +#define __NOINLINE _Pragma("optimize = no_inline") + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ___STM32F4xx_HAL_DEF */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h index a1bccd74..90dd292c 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h @@ -1,804 +1,804 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.h - * @author MCD Application Team - * @brief Header file of DMA HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_H -#define __STM32F4xx_HAL_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Types DMA Exported Types - * @brief DMA Exported Types - * @{ - */ - -/** - * @brief DMA Configuration Structure definition - */ -typedef struct -{ - uint32_t Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_Channel_selection */ - - uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_Data_transfer_direction */ - - uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ - - uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_Memory_incremented_mode */ - - uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_Peripheral_data_size */ - - uint32_t MemDataAlignment; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_Memory_data_size */ - - uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_Priority_level */ - - uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. - This parameter can be a value of @ref DMA_FIFO_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected stream */ - - uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_FIFO_threshold_level */ - - uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptible - transaction. - This parameter can be a value of @ref DMA_Peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - - -/** - * @brief HAL DMA State structures definition - */ -typedef enum -{ - HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ - HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ - HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ - HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ - HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ - HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ -}HAL_DMA_StateTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ -}HAL_DMA_LevelCompleteTypeDef; - -/** - * @brief HAL DMA Error Code structure definition - */ -typedef enum -{ - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ -}HAL_DMA_CallbackIDTypeDef; - -/** - * @brief DMA handle Structure definition - */ -typedef struct __DMA_HandleTypeDef -{ - DMA_Stream_TypeDef *Instance; /*!< Register base address */ - - DMA_InitTypeDef Init; /*!< DMA communication parameters */ - - HAL_LockTypeDef Lock; /*!< DMA locking object */ - - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - - void *Parent; /*!< Parent object state */ - - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ - - void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - - __IO uint32_t ErrorCode; /*!< DMA Error code */ - - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - - uint32_t StreamIndex; /*!< DMA Stream Index */ - -}DMA_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants DMA Exported Constants - * @brief DMA Exported constants - * @{ - */ - -/** @defgroup DMA_Error_Code DMA Error Code - * @brief DMA Error Code - * @{ - */ -#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ -#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ -#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ -/** - * @} - */ - -/** @defgroup DMA_Channel_selection DMA Channel selection - * @brief DMA channel selection - * @{ - */ -#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ -#if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ -#endif /* DMA_SxCR_CHSEL_3 */ -/** - * @} - */ - -/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction - * @brief DMA data transfer direction - * @{ - */ -#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode - * @brief DMA peripheral incremented mode - * @{ - */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode - * @brief DMA memory incremented mode - * @{ - */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ -/** - * @} - */ - -/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size - * @brief DMA peripheral data size - * @{ - */ -#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_Memory_data_size DMA Memory data size - * @brief DMA memory data size - * @{ - */ -#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ -/** - * @} - */ - -/** @defgroup DMA_mode DMA mode - * @brief DMA mode - * @{ - */ -#define DMA_NORMAL 0x00000000U /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ -/** - * @} - */ - -/** @defgroup DMA_Priority_level DMA Priority level - * @brief DMA priority levels - * @{ - */ -#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode - * @brief DMA FIFO direct mode - * @{ - */ -#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ -/** - * @} - */ - -/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level - * @brief DMA FIFO level - * @{ - */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ -#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ -#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ -#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ -/** - * @} - */ - -/** @defgroup DMA_Memory_burst DMA Memory burst - * @brief DMA memory burst - * @{ - */ -#define DMA_MBURST_SINGLE 0x00000000U -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) -/** - * @} - */ - -/** @defgroup DMA_Peripheral_burst DMA Peripheral burst - * @brief DMA peripheral burst - * @{ - */ -#define DMA_PBURST_SINGLE 0x00000000U -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) -/** - * @} - */ - -/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions - * @brief DMA interrupts definition - * @{ - */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE 0x00000080U -/** - * @} - */ - -/** @defgroup DMA_flag_definitions DMA flag definitions - * @brief DMA flag definitions - * @{ - */ -#define DMA_FLAG_FEIF0_4 0x00000001U -#define DMA_FLAG_DMEIF0_4 0x00000004U -#define DMA_FLAG_TEIF0_4 0x00000008U -#define DMA_FLAG_HTIF0_4 0x00000010U -#define DMA_FLAG_TCIF0_4 0x00000020U -#define DMA_FLAG_FEIF1_5 0x00000040U -#define DMA_FLAG_DMEIF1_5 0x00000100U -#define DMA_FLAG_TEIF1_5 0x00000200U -#define DMA_FLAG_HTIF1_5 0x00000400U -#define DMA_FLAG_TCIF1_5 0x00000800U -#define DMA_FLAG_FEIF2_6 0x00010000U -#define DMA_FLAG_DMEIF2_6 0x00040000U -#define DMA_FLAG_TEIF2_6 0x00080000U -#define DMA_FLAG_HTIF2_6 0x00100000U -#define DMA_FLAG_TCIF2_6 0x00200000U -#define DMA_FLAG_FEIF3_7 0x00400000U -#define DMA_FLAG_DMEIF3_7 0x01000000U -#define DMA_FLAG_TEIF3_7 0x02000000U -#define DMA_FLAG_HTIF3_7 0x04000000U -#define DMA_FLAG_TCIF3_7 0x08000000U -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ - -/** @brief Reset DMA handle state - * @param __HANDLE__ specifies the DMA handle. - * @retval None - */ -#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) - -/** - * @brief Return the current DMA Stream FIFO filled level. - * @param __HANDLE__ DMA handle - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) - -/** - * @brief Enable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) - -/** - * @brief Disable the specified DMA Stream. - * @param __HANDLE__ DMA handle - * @retval None - */ -#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) - -/* Interrupt & Flag management */ - -/** - * @brief Return the current DMA Stream transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer complete flag index. - */ -#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ - DMA_FLAG_TCIF3_7) - -/** - * @brief Return the current DMA Stream half transfer complete flag. - * @param __HANDLE__ DMA handle - * @retval The specified half transfer complete flag index. - */ -#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ - DMA_FLAG_HTIF3_7) - -/** - * @brief Return the current DMA Stream transfer error flag. - * @param __HANDLE__ DMA handle - * @retval The specified transfer error flag index. - */ -#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ - DMA_FLAG_TEIF3_7) - -/** - * @brief Return the current DMA Stream FIFO error flag. - * @param __HANDLE__ DMA handle - * @retval The specified FIFO error flag index. - */ -#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ - DMA_FLAG_FEIF3_7) - -/** - * @brief Return the current DMA Stream direct mode error flag. - * @param __HANDLE__ DMA handle - * @retval The specified direct mode error flag index. - */ -#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ -(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ - ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ - DMA_FLAG_DMEIF3_7) - -/** - * @brief Get the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ Get the specified flag. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval The state of FLAG (SET or RESET). - */ -#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) - -/** - * @brief Clear the DMA Stream pending flags. - * @param __HANDLE__ DMA handle - * @param __FLAG__ specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Transfer complete flag. - * @arg DMA_FLAG_HTIFx: Half transfer complete flag. - * @arg DMA_FLAG_TEIFx: Transfer error flag. - * @arg DMA_FLAG_DMEIFx: Direct mode error flag. - * @arg DMA_FLAG_FEIFx: FIFO error flag. - * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. - * @retval None - */ -#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ - ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) - -/** - * @brief Enable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) - -/** - * @brief Disable the specified DMA Stream interrupts. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval None - */ -#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ -((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) - -/** - * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. - * @param __HANDLE__ DMA handle - * @param __INTERRUPT__ specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask. - * @arg DMA_IT_HT: Half transfer complete interrupt mask. - * @arg DMA_IT_TE: Transfer error interrupt mask. - * @arg DMA_IT_FE: FIFO error interrupt mask. - * @arg DMA_IT_DME: Direct mode error interrupt. - * @retval The state of DMA_IT. - */ -#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ - ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ - ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) - -/** - * @brief Writes the number of data units to be transferred on the DMA Stream. - * @param __HANDLE__ DMA handle - * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param __HANDLE__ DMA handle - * - * @retval The number of remaining data units in the current DMA Stream transfer. - */ -#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) - - -/* Include DMA HAL Extension module */ -#include "stm32f4xx_hal_dma_ex.h" - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Functions DMA Exported Functions - * @brief DMA Exported functions - * @{ - */ - -/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions - * @brief I/O operation functions - * @{ - */ -HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/** - * @} - */ -/* Private Constants -------------------------------------------------------------*/ -/** @defgroup DMA_Private_Constants DMA Private Constants - * @brief DMA private defines and constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DMA_Private_Macros DMA Private Macros - * @brief DMA private macros - * @{ - */ -#if defined (DMA_SxCR_CHSEL_3) -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7) || \ - ((CHANNEL) == DMA_CHANNEL_8) || \ - ((CHANNEL) == DMA_CHANNEL_9) || \ - ((CHANNEL) == DMA_CHANNEL_10)|| \ - ((CHANNEL) == DMA_CHANNEL_11)|| \ - ((CHANNEL) == DMA_CHANNEL_12)|| \ - ((CHANNEL) == DMA_CHANNEL_13)|| \ - ((CHANNEL) == DMA_CHANNEL_14)|| \ - ((CHANNEL) == DMA_CHANNEL_15)) -#else -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ - ((CHANNEL) == DMA_CHANNEL_1) || \ - ((CHANNEL) == DMA_CHANNEL_2) || \ - ((CHANNEL) == DMA_CHANNEL_3) || \ - ((CHANNEL) == DMA_CHANNEL_4) || \ - ((CHANNEL) == DMA_CHANNEL_5) || \ - ((CHANNEL) == DMA_CHANNEL_6) || \ - ((CHANNEL) == DMA_CHANNEL_7)) -#endif /* DMA_SxCR_CHSEL_3 */ - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ - ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ - ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ - ((STATE) == DMA_PINC_DISABLE)) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ - ((STATE) == DMA_MINC_DISABLE)) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ - ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_PDATAALIGN_WORD)) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ - ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ - ((SIZE) == DMA_MDATAALIGN_WORD )) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ - ((MODE) == DMA_CIRCULAR) || \ - ((MODE) == DMA_PFCTRL)) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ - ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ - ((PRIORITY) == DMA_PRIORITY_HIGH) || \ - ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ - ((STATE) == DMA_FIFOMODE_ENABLE)) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ - ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ - ((BURST) == DMA_MBURST_INC4) || \ - ((BURST) == DMA_MBURST_INC8) || \ - ((BURST) == DMA_MBURST_INC16)) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ - ((BURST) == DMA_PBURST_INC4) || \ - ((BURST) == DMA_PBURST_INC8) || \ - ((BURST) == DMA_PBURST_INC16)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMA_Private_Functions DMA Private Functions - * @brief DMA private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_DMA_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma.h + * @author MCD Application Team + * @brief Header file of DMA HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_H +#define __STM32F4xx_HAL_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Types DMA Exported Types + * @brief DMA Exported Types + * @{ + */ + +/** + * @brief DMA Configuration Structure definition + */ +typedef struct +{ + uint32_t Channel; /*!< Specifies the channel used for the specified stream. + This parameter can be a value of @ref DMA_Channel_selection */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_Data_transfer_direction */ + + uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. + This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ + + uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. + This parameter can be a value of @ref DMA_Memory_incremented_mode */ + + uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_Peripheral_data_size */ + + uint32_t MemDataAlignment; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_Memory_data_size */ + + uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. + This parameter can be a value of @ref DMA_mode + @note The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Stream */ + + uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. + This parameter can be a value of @ref DMA_Priority_level */ + + uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. + This parameter can be a value of @ref DMA_FIFO_direct_mode + @note The Direct mode (FIFO mode disabled) cannot be used if the + memory-to-memory data transfer is configured on the selected stream */ + + uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. + This parameter can be a value of @ref DMA_FIFO_threshold_level */ + + uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Memory_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ + + uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Peripheral_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ +}DMA_InitTypeDef; + + +/** + * @brief HAL DMA State structures definition + */ +typedef enum +{ + HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ + HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ + HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ + HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ + HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ + HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ +}HAL_DMA_StateTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ + HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ +}HAL_DMA_LevelCompleteTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ + HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ + HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ + HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ + HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ + HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ + HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ +}HAL_DMA_CallbackIDTypeDef; + +/** + * @brief DMA handle Structure definition + */ +typedef struct __DMA_HandleTypeDef +{ + DMA_Stream_TypeDef *Instance; /*!< Register base address */ + + DMA_InitTypeDef Init; /*!< DMA communication parameters */ + + HAL_LockTypeDef Lock; /*!< DMA locking object */ + + __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ + + void *Parent; /*!< Parent object state */ + + void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ + + void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ + + void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ + + void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ + + void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ + + void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ + + __IO uint32_t ErrorCode; /*!< DMA Error code */ + + uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ + + uint32_t StreamIndex; /*!< DMA Stream Index */ + +}DMA_HandleTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Constants DMA Exported Constants + * @brief DMA Exported constants + * @{ + */ + +/** @defgroup DMA_Error_Code DMA Error Code + * @brief DMA Error Code + * @{ + */ +#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ +#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ +#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ +#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ +#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ +/** + * @} + */ + +/** @defgroup DMA_Channel_selection DMA Channel selection + * @brief DMA channel selection + * @{ + */ +#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ +#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ +#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ +#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ +#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ +#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ +#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ +#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ +#if defined (DMA_SxCR_CHSEL_3) +#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ +#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ +#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ +#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ +#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ +#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ +#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ +#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ +#endif /* DMA_SxCR_CHSEL_3 */ +/** + * @} + */ + +/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction + * @brief DMA data transfer direction + * @{ + */ +#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ +#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode + * @brief DMA peripheral incremented mode + * @{ + */ +#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ +#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode + * @brief DMA memory incremented mode + * @{ + */ +#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ +#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size + * @brief DMA peripheral data size + * @{ + */ +#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ +#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ +#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_Memory_data_size DMA Memory data size + * @brief DMA memory data size + * @{ + */ +#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ +#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ +#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_mode DMA mode + * @brief DMA mode + * @{ + */ +#define DMA_NORMAL 0x00000000U /*!< Normal mode */ +#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ +#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ +/** + * @} + */ + +/** @defgroup DMA_Priority_level DMA Priority level + * @brief DMA priority levels + * @{ + */ +#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ +#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ +#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ +#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode + * @brief DMA FIFO direct mode + * @{ + */ +#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ +#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level + * @brief DMA FIFO level + * @{ + */ +#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ +#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ +#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ +#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ +/** + * @} + */ + +/** @defgroup DMA_Memory_burst DMA Memory burst + * @brief DMA memory burst + * @{ + */ +#define DMA_MBURST_SINGLE 0x00000000U +#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) +#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) +#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) +/** + * @} + */ + +/** @defgroup DMA_Peripheral_burst DMA Peripheral burst + * @brief DMA peripheral burst + * @{ + */ +#define DMA_PBURST_SINGLE 0x00000000U +#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) +#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) +#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) +/** + * @} + */ + +/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions + * @brief DMA interrupts definition + * @{ + */ +#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) +#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) +#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) +#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) +#define DMA_IT_FE 0x00000080U +/** + * @} + */ + +/** @defgroup DMA_flag_definitions DMA flag definitions + * @brief DMA flag definitions + * @{ + */ +#define DMA_FLAG_FEIF0_4 0x00000001U +#define DMA_FLAG_DMEIF0_4 0x00000004U +#define DMA_FLAG_TEIF0_4 0x00000008U +#define DMA_FLAG_HTIF0_4 0x00000010U +#define DMA_FLAG_TCIF0_4 0x00000020U +#define DMA_FLAG_FEIF1_5 0x00000040U +#define DMA_FLAG_DMEIF1_5 0x00000100U +#define DMA_FLAG_TEIF1_5 0x00000200U +#define DMA_FLAG_HTIF1_5 0x00000400U +#define DMA_FLAG_TCIF1_5 0x00000800U +#define DMA_FLAG_FEIF2_6 0x00010000U +#define DMA_FLAG_DMEIF2_6 0x00040000U +#define DMA_FLAG_TEIF2_6 0x00080000U +#define DMA_FLAG_HTIF2_6 0x00100000U +#define DMA_FLAG_TCIF2_6 0x00200000U +#define DMA_FLAG_FEIF3_7 0x00400000U +#define DMA_FLAG_DMEIF3_7 0x01000000U +#define DMA_FLAG_TEIF3_7 0x02000000U +#define DMA_FLAG_HTIF3_7 0x04000000U +#define DMA_FLAG_TCIF3_7 0x08000000U +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/** @brief Reset DMA handle state + * @param __HANDLE__ specifies the DMA handle. + * @retval None + */ +#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) + +/** + * @brief Return the current DMA Stream FIFO filled level. + * @param __HANDLE__ DMA handle + * @retval The FIFO filling state. + * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full + * and not empty. + * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. + * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. + * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. + * - DMA_FIFOStatus_Empty: when FIFO is empty + * - DMA_FIFOStatus_Full: when FIFO is full + */ +#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) + +/** + * @brief Enable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) + +/** + * @brief Disable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) + +/* Interrupt & Flag management */ + +/** + * @brief Return the current DMA Stream transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer complete flag index. + */ +#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ + DMA_FLAG_TCIF3_7) + +/** + * @brief Return the current DMA Stream half transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified half transfer complete flag index. + */ +#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ + DMA_FLAG_HTIF3_7) + +/** + * @brief Return the current DMA Stream transfer error flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer error flag index. + */ +#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ + DMA_FLAG_TEIF3_7) + +/** + * @brief Return the current DMA Stream FIFO error flag. + * @param __HANDLE__ DMA handle + * @retval The specified FIFO error flag index. + */ +#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ + DMA_FLAG_FEIF3_7) + +/** + * @brief Return the current DMA Stream direct mode error flag. + * @param __HANDLE__ DMA handle + * @retval The specified direct mode error flag index. + */ +#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ + DMA_FLAG_DMEIF3_7) + +/** + * @brief Get the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ Get the specified flag. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval The state of FLAG (SET or RESET). + */ +#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) + +/** + * @brief Clear the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval None + */ +#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) + +/** + * @brief Enable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) + +/** + * @brief Disable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) + +/** + * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval The state of DMA_IT. + */ +#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ + ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ + ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) + +/** + * @brief Writes the number of data units to be transferred on the DMA Stream. + * @param __HANDLE__ DMA handle + * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) + * Number of data items depends only on the Peripheral data format. + * + * @note If Peripheral data format is Bytes: number of data units is equal + * to total number of bytes to be transferred. + * + * @note If Peripheral data format is Half-Word: number of data units is + * equal to total number of bytes to be transferred / 2. + * + * @note If Peripheral data format is Word: number of data units is equal + * to total number of bytes to be transferred / 4. + * + * @retval The number of remaining data units in the current DMAy Streamx transfer. + */ +#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) + +/** + * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. + * @param __HANDLE__ DMA handle + * + * @retval The number of remaining data units in the current DMA Stream transfer. + */ +#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) + + +/* Include DMA HAL Extension module */ +#include "stm32f4xx_hal_dma_ex.h" + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Functions DMA Exported Functions + * @brief DMA Exported functions + * @{ + */ + +/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions + * @brief I/O operation functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/** + * @} + */ +/* Private Constants -------------------------------------------------------------*/ +/** @defgroup DMA_Private_Constants DMA Private Constants + * @brief DMA private defines and constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DMA_Private_Macros DMA Private Macros + * @brief DMA private macros + * @{ + */ +#if defined (DMA_SxCR_CHSEL_3) +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7) || \ + ((CHANNEL) == DMA_CHANNEL_8) || \ + ((CHANNEL) == DMA_CHANNEL_9) || \ + ((CHANNEL) == DMA_CHANNEL_10)|| \ + ((CHANNEL) == DMA_CHANNEL_11)|| \ + ((CHANNEL) == DMA_CHANNEL_12)|| \ + ((CHANNEL) == DMA_CHANNEL_13)|| \ + ((CHANNEL) == DMA_CHANNEL_14)|| \ + ((CHANNEL) == DMA_CHANNEL_15)) +#else +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7)) +#endif /* DMA_SxCR_CHSEL_3 */ + +#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ + ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ + ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) + +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ + ((STATE) == DMA_PINC_DISABLE)) + +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ + ((STATE) == DMA_MINC_DISABLE)) + +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ + ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_PDATAALIGN_WORD)) + +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ + ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_MDATAALIGN_WORD )) + +#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ + ((MODE) == DMA_CIRCULAR) || \ + ((MODE) == DMA_PFCTRL)) + +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ + ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ + ((PRIORITY) == DMA_PRIORITY_HIGH) || \ + ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) + +#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ + ((STATE) == DMA_FIFOMODE_ENABLE)) + +#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) + +#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ + ((BURST) == DMA_MBURST_INC4) || \ + ((BURST) == DMA_MBURST_INC8) || \ + ((BURST) == DMA_MBURST_INC16)) + +#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ + ((BURST) == DMA_PBURST_INC4) || \ + ((BURST) == DMA_PBURST_INC8) || \ + ((BURST) == DMA_PBURST_INC16)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMA_Private_Functions DMA Private Functions + * @brief DMA private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_DMA_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h index 369f5279..2e60aff2 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h @@ -1,104 +1,104 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.h - * @author MCD Application Team - * @brief Header file of DMA HAL extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_DMA_EX_H -#define __STM32F4xx_HAL_DMA_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup DMAEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Types DMAEx Exported Types - * @brief DMAEx Exported types - * @{ - */ - -/** - * @brief HAL DMA Memory definition - */ -typedef enum -{ - MEMORY0 = 0x00U, /*!< Memory 0 */ - MEMORY1 = 0x01U /*!< Memory 1 */ -}HAL_DMA_MemoryTypeDef; - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions - * @brief DMAEx Exported functions - * @{ - */ - -/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions - * @brief Extended features functions - * @{ - */ - -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); - -/** - * @} - */ -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DMAEx_Private_Functions DMAEx Private Functions - * @brief DMAEx Private functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HAL_DMA_EX_H*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.h + * @author MCD Application Team + * @brief Header file of DMA HAL extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_EX_H +#define __STM32F4xx_HAL_DMA_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMAEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Types DMAEx Exported Types + * @brief DMAEx Exported types + * @{ + */ + +/** + * @brief HAL DMA Memory definition + */ +typedef enum +{ + MEMORY0 = 0x00U, /*!< Memory 0 */ + MEMORY1 = 0x01U /*!< Memory 1 */ +}HAL_DMA_MemoryTypeDef; + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions + * @brief DMAEx Exported functions + * @{ + */ + +/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions + * @brief Extended features functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); + +/** + * @} + */ +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMAEx_Private_Functions DMAEx Private Functions + * @brief DMAEx Private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F4xx_HAL_DMA_EX_H*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h index 73bb134e..ff74222e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h @@ -1,368 +1,368 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.h - * @author MCD Application Team - * @brief Header file of EXTI HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2018 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32f4xx_HAL_EXTI_H -#define STM32f4xx_HAL_EXTI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup EXTI EXTI - * @brief EXTI HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Types EXTI Exported Types - * @{ - */ -typedef enum -{ - HAL_EXTI_COMMON_CB_ID = 0x00U -} EXTI_CallbackIDTypeDef; - -/** - * @brief EXTI Handle structure definition - */ -typedef struct -{ - uint32_t Line; /*!< Exti line number */ - void (* PendingCallback)(void); /*!< Exti pending callback */ -} EXTI_HandleTypeDef; - -/** - * @brief EXTI Configuration structure definition - */ -typedef struct -{ - uint32_t Line; /*!< The Exti line to be configured. This parameter - can be a value of @ref EXTI_Line */ - uint32_t Mode; /*!< The Exit Mode to be configured for a core. - This parameter can be a combination of @ref EXTI_Mode */ - uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter - can be a value of @ref EXTI_Trigger */ - uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. - This parameter is only possible for line 0 to 15. It - can be a value of @ref EXTI_GPIOSel */ -} EXTI_ConfigTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Constants EXTI Exported Constants - * @{ - */ - -/** @defgroup EXTI_Line EXTI Line - * @{ - */ -#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ -#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ -#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ -#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ -#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ -#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ -#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ -#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ -#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ -#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ -#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ -#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ -#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ -#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ -#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ -#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ -#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#else -#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#else -#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#else -#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ -#endif /* EXTI_IMR_IM20 */ -#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/** @defgroup EXTI_Mode EXTI Mode - * @{ - */ -#define EXTI_MODE_NONE 0x00000000u -#define EXTI_MODE_INTERRUPT 0x00000001u -#define EXTI_MODE_EVENT 0x00000002u -/** - * @} - */ - -/** @defgroup EXTI_Trigger EXTI Trigger - * @{ - */ - -#define EXTI_TRIGGER_NONE 0x00000000u -#define EXTI_TRIGGER_RISING 0x00000001u -#define EXTI_TRIGGER_FALLING 0x00000002u -#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) -/** - * @} - */ - -/** @defgroup EXTI_GPIOSel EXTI GPIOSel - * @brief - * @{ - */ -#define EXTI_GPIOA 0x00000000u -#define EXTI_GPIOB 0x00000001u -#define EXTI_GPIOC 0x00000002u -#if defined (GPIOD) -#define EXTI_GPIOD 0x00000003u -#endif /* GPIOD */ -#if defined (GPIOE) -#define EXTI_GPIOE 0x00000004u -#endif /* GPIOE */ -#if defined (GPIOF) -#define EXTI_GPIOF 0x00000005u -#endif /* GPIOF */ -#if defined (GPIOG) -#define EXTI_GPIOG 0x00000006u -#endif /* GPIOG */ -#if defined (GPIOH) -#define EXTI_GPIOH 0x00000007u -#endif /* GPIOH */ -#if defined (GPIOI) -#define EXTI_GPIOI 0x00000008u -#endif /* GPIOI */ -#if defined (GPIOJ) -#define EXTI_GPIOJ 0x00000009u -#endif /* GPIOJ */ -#if defined (GPIOK) -#define EXTI_GPIOK 0x0000000Au -#endif /* GPIOK */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Macros EXTI Exported Macros - * @{ - */ - -/** - * @} - */ - -/* Private constants --------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ -/** - * @brief EXTI Line property definition - */ -#define EXTI_PROPERTY_SHIFT 24u -#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) -#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) -#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) -#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) - -/** - * @brief EXTI bit usage - */ -#define EXTI_PIN_MASK 0x0000001Fu - -/** - * @brief EXTI Mask for interrupt & event mode - */ -#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) - -/** - * @brief EXTI Mask for trigger possibilities - */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) - -/** - * @brief EXTI Line number - */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_NB 24UL -#else -#define EXTI_LINE_NB 23UL -#endif /* EXTI_IMR_IM23 */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup EXTI_Private_Macros EXTI Private Macros - * @{ - */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ - ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ - (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ - (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) - -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ - (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) - -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) - -#define IS_EXTI_PENDING_EDGE(__LINE__) ((__LINE__) == EXTI_TRIGGER_RISING_FALLING) - -#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) - -#if !defined (GPIOD) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOE) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOF) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOI) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH)) -#elif !defined (GPIOJ) -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI)) -#else -#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ - ((__PORT__) == EXTI_GPIOB) || \ - ((__PORT__) == EXTI_GPIOC) || \ - ((__PORT__) == EXTI_GPIOD) || \ - ((__PORT__) == EXTI_GPIOE) || \ - ((__PORT__) == EXTI_GPIOF) || \ - ((__PORT__) == EXTI_GPIOG) || \ - ((__PORT__) == EXTI_GPIOH) || \ - ((__PORT__) == EXTI_GPIOI) || \ - ((__PORT__) == EXTI_GPIOJ) || \ - ((__PORT__) == EXTI_GPIOK)) -#endif /* GPIOD */ - -#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup EXTI_Exported_Functions EXTI Exported Functions - * @brief EXTI Exported Functions - * @{ - */ - -/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions - * @brief Configuration functions - * @{ - */ -/* Configuration functions ****************************************************/ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * @{ - */ -/* IO operation functions *****************************************************/ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32f4xx_HAL_EXTI_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.h + * @author MCD Application Team + * @brief Header file of EXTI HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32f4xx_HAL_EXTI_H +#define STM32f4xx_HAL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup EXTI EXTI + * @brief EXTI HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup EXTI_Exported_Types EXTI Exported Types + * @{ + */ +typedef enum +{ + HAL_EXTI_COMMON_CB_ID = 0x00U +} EXTI_CallbackIDTypeDef; + +/** + * @brief EXTI Handle structure definition + */ +typedef struct +{ + uint32_t Line; /*!< Exti line number */ + void (* PendingCallback)(void); /*!< Exti pending callback */ +} EXTI_HandleTypeDef; + +/** + * @brief EXTI Configuration structure definition + */ +typedef struct +{ + uint32_t Line; /*!< The Exti line to be configured. This parameter + can be a value of @ref EXTI_Line */ + uint32_t Mode; /*!< The Exit Mode to be configured for a core. + This parameter can be a combination of @ref EXTI_Mode */ + uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter + can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ +} EXTI_ConfigTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Constants EXTI Exported Constants + * @{ + */ + +/** @defgroup EXTI_Line EXTI Line + * @{ + */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#if defined(EXTI_IMR_IM18) +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#else +#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM18 */ +#if defined(EXTI_IMR_IM19) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM19 */ +#if defined(EXTI_IMR_IM20) +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#else +#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM20 */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/** @defgroup EXTI_Mode EXTI Mode + * @{ + */ +#define EXTI_MODE_NONE 0x00000000u +#define EXTI_MODE_INTERRUPT 0x00000001u +#define EXTI_MODE_EVENT 0x00000002u +/** + * @} + */ + +/** @defgroup EXTI_Trigger EXTI Trigger + * @{ + */ + +#define EXTI_TRIGGER_NONE 0x00000000u +#define EXTI_TRIGGER_RISING 0x00000001u +#define EXTI_TRIGGER_FALLING 0x00000002u +#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) +/** + * @} + */ + +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#if defined (GPIOD) +#define EXTI_GPIOD 0x00000003u +#endif /* GPIOD */ +#if defined (GPIOE) +#define EXTI_GPIOE 0x00000004u +#endif /* GPIOE */ +#if defined (GPIOF) +#define EXTI_GPIOF 0x00000005u +#endif /* GPIOF */ +#if defined (GPIOG) +#define EXTI_GPIOG 0x00000006u +#endif /* GPIOG */ +#if defined (GPIOH) +#define EXTI_GPIOH 0x00000007u +#endif /* GPIOH */ +#if defined (GPIOI) +#define EXTI_GPIOI 0x00000008u +#endif /* GPIOI */ +#if defined (GPIOJ) +#define EXTI_GPIOJ 0x00000009u +#endif /* GPIOJ */ +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Macros EXTI Exported Macros + * @{ + */ + +/** + * @} + */ + +/* Private constants --------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + +/** + * @brief EXTI Mask for interrupt & event mode + */ +#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) + +/** + * @brief EXTI Mask for trigger possibilities + */ +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) + +/** + * @brief EXTI Line number + */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_NB 24UL +#else +#define EXTI_LINE_NB 23UL +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup EXTI_Private_Macros EXTI Private Macros + * @{ + */ +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) + +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) + +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) + +#define IS_EXTI_PENDING_EDGE(__LINE__) ((__LINE__) == EXTI_TRIGGER_RISING_FALLING) + +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if !defined (GPIOD) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOE) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOF) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOI) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOJ) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#endif /* GPIOD */ + +#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Functions EXTI Exported Functions + * @brief EXTI Exported Functions + * @{ + */ + +/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions + * @brief Configuration functions + * @{ + */ +/* Configuration functions ****************************************************/ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * @{ + */ +/* IO operation functions *****************************************************/ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32f4xx_HAL_EXTI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h index 53666ac0..b817f63b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h @@ -1,428 +1,428 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.h - * @author MCD Application Team - * @brief Header file of FLASH HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_H -#define __STM32F4xx_HAL_FLASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Procedure structure definition - */ -typedef enum -{ - FLASH_PROC_NONE = 0U, - FLASH_PROC_SECTERASE, - FLASH_PROC_MASSERASE, - FLASH_PROC_PROGRAM -} FLASH_ProcedureTypeDef; - -/** - * @brief FLASH handle Structure definition - */ -typedef struct -{ - __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ - - __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ - - __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ - - __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ - - __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ - - __IO uint32_t Address; /*Internal variable to save address selected for program*/ - - HAL_LockTypeDef Lock; /* FLASH locking object */ - - __IO uint32_t ErrorCode; /* FLASH error code */ - -}FLASH_ProcessTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Constants FLASH Exported Constants - * @{ - */ -/** @defgroup FLASH_Error_Code FLASH Error Code - * @brief FLASH Error Code - * @{ - */ -#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ -#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ -/** - * @} - */ - -/** @defgroup FLASH_Type_Program FLASH Type Program - * @{ - */ -#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ -/** - * @} - */ - -/** @defgroup FLASH_Flag_definition FLASH Flag definition - * @brief Flag definition - * @{ - */ -#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#if defined(FLASH_SR_RDERR) -#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ -#endif /* FLASH_SR_RDERR */ -#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ -/** - * @} - */ - -/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition - * @brief FLASH Interrupt definition - * @{ - */ -#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE 0x00000000U -#define FLASH_PSIZE_HALF_WORD 0x00000100U -#define FLASH_PSIZE_WORD 0x00000200U -#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U -#define CR_PSIZE_MASK 0xFFFFFCFFU -/** - * @} - */ - -/** @defgroup FLASH_Keys FLASH Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 0x45670123U -#define FLASH_KEY2 0xCDEF89ABU -#define FLASH_OPT_KEY1 0x08192A3BU -#define FLASH_OPT_KEY2 0x4C5D6E7FU -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Macros FLASH Exported Macros - * @{ - */ -/** - * @brief Set the FLASH Latency. - * @param __LATENCY__ FLASH Latency - * The value of this parameter depend on device used within the same series - * @retval none - */ -#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) - -/** - * @brief Get the FLASH Latency. - * @retval FLASH Latency - * The value of this parameter depend on device used within the same series - */ -#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) - -/** - * @brief Enable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) - -/** - * @brief Disable the FLASH prefetch buffer. - * @retval none - */ -#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) - -/** - * @brief Enable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) - -/** - * @brief Disable the FLASH instruction cache. - * @retval none - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) - -/** - * @brief Enable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) - -/** - * @brief Disable the FLASH data cache. - * @retval none - */ -#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) - -/** - * @brief Resets the FLASH instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ - FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0U) - -/** - * @brief Resets the FLASH data Cache. - * @note This function must be used only when the data Cache is disabled. - * @retval None - */ -#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ - FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0U) -/** - * @brief Enable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) - -/** - * @brief Disable the specified FLASH interrupt. - * @param __INTERRUPT__ FLASH interrupt - * This parameter can be any combination of the following values: - * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt - * @arg FLASH_IT_ERR: Error Interrupt - * @retval none - */ -#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) - -/** - * @brief Get the specified FLASH flag status. - * @param __FLAG__ specifies the FLASH flags to check. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * @arg FLASH_FLAG_BSY : FLASH Busy flag - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval The new state of __FLAG__ (SET or RESET). - */ -#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) - -/** - * @brief Clear the specified FLASH flags. - * @param __FLAG__ specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP : FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR : FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) - * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices - * @retval none - */ -#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) -/** - * @} - */ - -/* Include FLASH HAL Extension module */ -#include "stm32f4xx_hal_flash_ex.h" -#include "stm32f4xx_hal_flash_ramfunc.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_Exported_Functions - * @{ - */ -/** @addtogroup FLASH_Exported_Functions_Group1 - * @{ - */ -/* Program operation functions ***********************************************/ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); -/* FLASH IRQ handler method */ -void HAL_FLASH_IRQHandler(void); -/* Callbacks in non blocking modes */ -void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); -void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group2 - * @{ - */ -/* Peripheral Control functions **********************************************/ -HAL_StatusTypeDef HAL_FLASH_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_Lock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); -/* Option bytes control */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); -/** - * @} - */ - -/** @addtogroup FLASH_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -uint32_t HAL_FLASH_GetError(void); -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Variables FLASH Private Variables - * @{ - */ - -/** - * @} - */ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Constants FLASH Private Constants - * @{ - */ - -/** - * @brief ACR register byte 0 (Bits[7:0]) base address - */ -#define ACR_BYTE0_ADDRESS 0x40023C00U -/** - * @brief OPTCR register byte 0 (Bits[7:0]) base address - */ -#define OPTCR_BYTE0_ADDRESS 0x40023C14U -/** - * @brief OPTCR register byte 1 (Bits[15:8]) base address - */ -#define OPTCR_BYTE1_ADDRESS 0x40023C15U -/** - * @brief OPTCR register byte 2 (Bits[23:16]) base address - */ -#define OPTCR_BYTE2_ADDRESS 0x40023C16U -/** - * @brief OPTCR register byte 3 (Bits[31:24]) base address - */ -#define OPTCR_BYTE3_ADDRESS 0x40023C17U - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup FLASH_Private_Macros FLASH Private Macros - * @{ - */ - -/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters - * @{ - */ -#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ - ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ - ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASH_Private_Functions FLASH Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.h + * @author MCD Application Team + * @brief Header file of FLASH HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_H +#define __STM32F4xx_HAL_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Procedure structure definition + */ +typedef enum +{ + FLASH_PROC_NONE = 0U, + FLASH_PROC_SECTERASE, + FLASH_PROC_MASSERASE, + FLASH_PROC_PROGRAM +} FLASH_ProcedureTypeDef; + +/** + * @brief FLASH handle Structure definition + */ +typedef struct +{ + __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ + + __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ + + __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ + + __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ + + __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ + + __IO uint32_t Address; /*Internal variable to save address selected for program*/ + + HAL_LockTypeDef Lock; /* FLASH locking object */ + + __IO uint32_t ErrorCode; /* FLASH error code */ + +}FLASH_ProcessTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Constants FLASH Exported Constants + * @{ + */ +/** @defgroup FLASH_Error_Code FLASH Error Code + * @brief FLASH Error Code + * @{ + */ +#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ +#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ +#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ +#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ +#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ +#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ +/** + * @} + */ + +/** @defgroup FLASH_Type_Program FLASH Type Program + * @{ + */ +#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ +/** + * @} + */ + +/** @defgroup FLASH_Flag_definition FLASH Flag definition + * @brief Flag definition + * @{ + */ +#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ +#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ +#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ +#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ +#if defined(FLASH_SR_RDERR) +#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ +#endif /* FLASH_SR_RDERR */ +#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ +/** + * @} + */ + +/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition + * @brief FLASH Interrupt definition + * @{ + */ +#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ +#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ +/** + * @} + */ + +/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism + * @{ + */ +#define FLASH_PSIZE_BYTE 0x00000000U +#define FLASH_PSIZE_HALF_WORD 0x00000100U +#define FLASH_PSIZE_WORD 0x00000200U +#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U +#define CR_PSIZE_MASK 0xFFFFFCFFU +/** + * @} + */ + +/** @defgroup FLASH_Keys FLASH Keys + * @{ + */ +#define RDP_KEY ((uint16_t)0x00A5) +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +#define FLASH_OPT_KEY1 0x08192A3BU +#define FLASH_OPT_KEY2 0x4C5D6E7FU +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Macros FLASH Exported Macros + * @{ + */ +/** + * @brief Set the FLASH Latency. + * @param __LATENCY__ FLASH Latency + * The value of this parameter depend on device used within the same series + * @retval none + */ +#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) + +/** + * @brief Get the FLASH Latency. + * @retval FLASH Latency + * The value of this parameter depend on device used within the same series + */ +#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) + +/** + * @brief Enable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) + +/** + * @brief Disable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) + +/** + * @brief Enable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) + +/** + * @brief Disable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) + +/** + * @brief Enable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) + +/** + * @brief Disable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) + +/** + * @brief Resets the FLASH instruction Cache. + * @note This function must be used only when the Instruction Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ + FLASH->ACR &= ~FLASH_ACR_ICRST; \ + }while(0U) + +/** + * @brief Resets the FLASH data Cache. + * @note This function must be used only when the data Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ + FLASH->ACR &= ~FLASH_ACR_DCRST; \ + }while(0U) +/** + * @brief Enable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) + +/** + * @brief Disable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) + +/** + * @brief Get the specified FLASH flag status. + * @param __FLAG__ specifies the FLASH flags to check. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * @arg FLASH_FLAG_BSY : FLASH Busy flag + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) + +/** + * @brief Clear the specified FLASH flags. + * @param __FLAG__ specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval none + */ +#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) +/** + * @} + */ + +/* Include FLASH HAL Extension module */ +#include "stm32f4xx_hal_flash_ex.h" +#include "stm32f4xx_hal_flash_ramfunc.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_Exported_Functions + * @{ + */ +/** @addtogroup FLASH_Exported_Functions_Group1 + * @{ + */ +/* Program operation functions ***********************************************/ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +/* FLASH IRQ handler method */ +void HAL_FLASH_IRQHandler(void); +/* Callbacks in non blocking modes */ +void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); +void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions **********************************************/ +HAL_StatusTypeDef HAL_FLASH_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_Lock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); +/* Option bytes control */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State functions ************************************************/ +uint32_t HAL_FLASH_GetError(void); +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Variables FLASH Private Variables + * @{ + */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Constants FLASH Private Constants + * @{ + */ + +/** + * @brief ACR register byte 0 (Bits[7:0]) base address + */ +#define ACR_BYTE0_ADDRESS 0x40023C00U +/** + * @brief OPTCR register byte 0 (Bits[7:0]) base address + */ +#define OPTCR_BYTE0_ADDRESS 0x40023C14U +/** + * @brief OPTCR register byte 1 (Bits[15:8]) base address + */ +#define OPTCR_BYTE1_ADDRESS 0x40023C15U +/** + * @brief OPTCR register byte 2 (Bits[23:16]) base address + */ +#define OPTCR_BYTE2_ADDRESS 0x40023C16U +/** + * @brief OPTCR register byte 3 (Bits[31:24]) base address + */ +#define OPTCR_BYTE3_ADDRESS 0x40023C17U + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FLASH_Private_Macros FLASH Private Macros + * @{ + */ + +/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters + * @{ + */ +#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ + ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Functions FLASH Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h index 60559aef..4dbad673 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h @@ -1,1066 +1,1066 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.h - * @author MCD Application Team - * @brief Header file of FLASH HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_FLASH_EX_H -#define __STM32F4xx_HAL_FLASH_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASHEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Types FLASH Exported Types - * @{ - */ - -/** - * @brief FLASH Erase structure definition - */ -typedef struct -{ - uint32_t TypeErase; /*!< Mass erase or sector Erase. - This parameter can be a value of @ref FLASHEx_Type_Erase */ - - uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled - This parameter must be a value of @ref FLASHEx_Sectors */ - - uint32_t NbSectors; /*!< Number of sectors to be erased. - This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ - - uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism - This parameter must be a value of @ref FLASHEx_Voltage_Range */ - -} FLASH_EraseInitTypeDef; - -/** - * @brief FLASH Option Bytes Program structure definition - */ -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured. - This parameter can be a value of @ref FLASHEx_Option_Type */ - - uint32_t WRPState; /*!< Write protection activation or deactivation. - This parameter can be a value of @ref FLASHEx_WRP_State */ - - uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. - The value of this parameter depend on device used within the same series */ - - uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint32_t RDPLevel; /*!< Set the read protection level. - This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ - - uint32_t BORLevel; /*!< Set the BOR Level. - This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ - - uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ - -} FLASH_OBProgramInitTypeDef; - -/** - * @brief FLASH Advanced Option Bytes Program structure definition - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -typedef struct -{ - uint32_t OptionType; /*!< Option byte to be configured for extension. - This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ - - uint32_t PCROPState; /*!< PCROP activation or deactivation. - This parameter can be a value of @ref FLASHEx_PCROP_State */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. - This parameter must be a value of @ref FLASHEx_Banks */ - - uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. - This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ - - uint8_t BootConfig; /*!< Specifies Option bytes for boot config. - This parameter can be a value of @ref FLASHEx_Dual_Boot */ - -#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -}FLASH_AdvOBProgramInitTypeDef; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants - * @{ - */ - -/** @defgroup FLASHEx_Type_Erase FLASH Type Erase - * @{ - */ -#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ -/** - * @} - */ - -/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range - * @{ - */ -#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ -/** - * @} - */ - -/** @defgroup FLASHEx_WRP_State FLASH WRP State - * @{ - */ -#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Type FLASH Option Type - * @{ - */ -#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection - * @{ - */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 - it s no more possible to go back to level 1 or 0 */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -/** - * @} - */ - -/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP - * @{ - */ -#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -/** - * @} - */ - - -/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY - * @{ - */ -#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -/** - * @} - */ - -/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup FLASHEx_PCROP_State FLASH PCROP State - * @{ - */ -#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ - (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) - -#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xC */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) -#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup FLASHEx_Private_Functions FLASH Private Functions - * @{ - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); -void FLASH_FlushCaches(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_FLASH_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.h + * @author MCD Application Team + * @brief Header file of FLASH HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_EX_H +#define __STM32F4xx_HAL_FLASH_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASHEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Erase structure definition + */ +typedef struct +{ + uint32_t TypeErase; /*!< Mass erase or sector Erase. + This parameter can be a value of @ref FLASHEx_Type_Erase */ + + uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled + This parameter must be a value of @ref FLASHEx_Sectors */ + + uint32_t NbSectors; /*!< Number of sectors to be erased. + This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ + + uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism + This parameter must be a value of @ref FLASHEx_Voltage_Range */ + +} FLASH_EraseInitTypeDef; + +/** + * @brief FLASH Option Bytes Program structure definition + */ +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured. + This parameter can be a value of @ref FLASHEx_Option_Type */ + + uint32_t WRPState; /*!< Write protection activation or deactivation. + This parameter can be a value of @ref FLASHEx_WRP_State */ + + uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. + The value of this parameter depend on device used within the same series */ + + uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t RDPLevel; /*!< Set the read protection level. + This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ + + uint32_t BORLevel; /*!< Set the BOR Level. + This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ + + uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ + +} FLASH_OBProgramInitTypeDef; + +/** + * @brief FLASH Advanced Option Bytes Program structure definition + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured for extension. + This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ + + uint32_t PCROPState; /*!< PCROP activation or deactivation. + This parameter can be a value of @ref FLASHEx_PCROP_State */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ + STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint8_t BootConfig; /*!< Specifies Option bytes for boot config. + This parameter can be a value of @ref FLASHEx_Dual_Boot */ + +#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +}FLASH_AdvOBProgramInitTypeDef; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || + STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASHEx_Type_Erase FLASH Type Erase + * @{ + */ +#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ +#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ +/** + * @} + */ + +/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range + * @{ + */ +#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ +#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ +#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ +#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ +/** + * @} + */ + +/** @defgroup FLASHEx_WRP_State FLASH WRP State + * @{ + */ +#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ +#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Type FLASH Option Type + * @{ + */ +#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ +#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ +#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ +#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection + * @{ + */ +#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) +#define OB_RDP_LEVEL_1 ((uint8_t)0x55) +#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 + it s no more possible to go back to level 1 or 0 */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog + * @{ + */ +#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP + * @{ + */ +#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ +/** + * @} + */ + + +/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY + * @{ + */ +#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ +/** + * @} + */ + +/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level + * @{ + */ +#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ +#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ +#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ +#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup FLASHEx_PCROP_State FLASH PCROP State + * @{ + */ +#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ +#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ +#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ + (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) + +#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Functions FLASH Private Functions + * @{ + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); +void FLASH_FlushCaches(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h index fd86bf68..9fab0c98 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h @@ -1,79 +1,79 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.h - * @author MCD Application Team - * @brief Header file of FLASH RAMFUNC driver. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_RAMFUNC_H -#define __STM32F4xx_FLASH_RAMFUNC_H - -#ifdef __cplusplus - extern "C" { -#endif -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup FLASH_RAMFUNC_Exported_Functions - * @{ - */ - -/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 - * @{ - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.h + * @author MCD Application Team + * @brief Header file of FLASH RAMFUNC driver. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_FLASH_RAMFUNC_H +#define __STM32F4xx_FLASH_RAMFUNC_H + +#ifdef __cplusplus + extern "C" { +#endif +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_RAMFUNC_Exported_Functions + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 + * @{ + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h index 34d393ab..5a175384 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h @@ -1,309 +1,309 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.h - * @author MCD Application Team - * @brief Header file of GPIO HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_H -#define __STM32F4xx_HAL_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - uint32_t Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIO_mode_define */ - - uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. - This parameter can be a value of @ref GPIO_pull_define */ - - uint32_t Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIO_speed_define */ - - uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. - This parameter can be a value of @ref GPIO_Alternate_function_selection */ -}GPIO_InitTypeDef; - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - GPIO_PIN_RESET = 0, - GPIO_PIN_SET -}GPIO_PinState; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_pins_define GPIO pins define - * @{ - */ -#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ -/** - * @} - */ - -/** @defgroup GPIO_mode_define GPIO mode define - * @brief GPIO Configuration Mode - * Elements values convention: 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_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 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ -/** - * @} - */ - - /** @defgroup GPIO_pull_define GPIO pull define - * @brief GPIO Pull-Up or Pull-Down Activation - * @{ - */ -#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ -#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Macros GPIO Exported Macros - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param __EXTI_LINE__ specifies the EXTI line flag to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending flags. - * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval The new state of __EXTI_LINE__ (SET or RESET). - */ -#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) - -/** - * @brief Clears the EXTI's line pending bits. - * @param __EXTI_LINE__ specifies the EXTI lines to clear. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param __EXTI_LINE__ specifies the EXTI line to check. - * This parameter can be GPIO_PIN_x where x can be(0..15) - * @retval None - */ -#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) -/** - * @} - */ - -/* Include GPIO HAL Extension module */ -#include "stm32f4xx_hal_gpio_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup GPIO_Exported_Functions - * @{ - */ - -/** @addtogroup GPIO_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); -/** - * @} - */ - -/** @addtogroup GPIO_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *****************************************************/ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); -void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIO_Private_Macros GPIO Private Macros - * @{ - */ -#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ - ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ - ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ - ((MODE) == GPIO_MODE_AF_PP) ||\ - ((MODE) == GPIO_MODE_AF_OD) ||\ - ((MODE) == GPIO_MODE_IT_RISING) ||\ - ((MODE) == GPIO_MODE_IT_FALLING) ||\ - ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING) ||\ - ((MODE) == GPIO_MODE_EVT_FALLING) ||\ - ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ - ((MODE) == GPIO_MODE_ANALOG)) -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ - ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) -#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ - ((PULL) == GPIO_PULLDOWN)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIO_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_H +#define __STM32F4xx_HAL_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Types GPIO Exported Types + * @{ + */ + +/** + * @brief GPIO Init structure definition + */ +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode_define */ + + uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. + This parameter can be a value of @ref GPIO_pull_define */ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_speed_define */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_Alternate_function_selection */ +}GPIO_InitTypeDef; + +/** + * @brief GPIO Bit SET and Bit RESET enumeration + */ +typedef enum +{ + GPIO_PIN_RESET = 0, + GPIO_PIN_SET +}GPIO_PinState; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup GPIO_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_pins_define GPIO pins define + * @{ + */ +#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ + +#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ +/** + * @} + */ + +/** @defgroup GPIO_mode_define GPIO mode define + * @brief GPIO Configuration Mode + * Elements values convention: 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_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 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ +/** + * @} + */ + + /** @defgroup GPIO_pull_define GPIO pull define + * @brief GPIO Pull-Up or Pull-Down Activation + * @{ + */ +#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ +#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ +#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Macros GPIO Exported Macros + * @{ + */ + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param __EXTI_LINE__ specifies the EXTI line flag to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending flags. + * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending bits. + * @param __EXTI_LINE__ specifies the EXTI lines to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Generates a Software interrupt on selected EXTI line. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) +/** + * @} + */ + +/* Include GPIO HAL Extension module */ +#include "stm32f4xx_hal_gpio_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_Exported_Functions + * @{ + */ + +/** @addtogroup GPIO_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); +/** + * @} + */ + +/** @addtogroup GPIO_Exported_Functions_Group2 + * @{ + */ +/* IO operation functions *****************************************************/ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIO_Private_Macros GPIO Private Macros + * @{ + */ +#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) +#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ + ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ + ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ + ((MODE) == GPIO_MODE_AF_PP) ||\ + ((MODE) == GPIO_MODE_AF_OD) ||\ + ((MODE) == GPIO_MODE_IT_RISING) ||\ + ((MODE) == GPIO_MODE_IT_FALLING) ||\ + ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING) ||\ + ((MODE) == GPIO_MODE_EVT_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_ANALOG)) +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ + ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) +#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ + ((PULL) == GPIO_PULLDOWN)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h index 4e421082..aa1e34d8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h @@ -1,1592 +1,1592 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio_ex.h - * @author MCD Application Team - * @brief Header file of GPIO HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_GPIO_EX_H -#define __STM32F4xx_HAL_GPIO_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIOEx GPIOEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants - * @{ - */ - -/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection - * @{ - */ - -/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -/** @brief GPIO_Legacy - */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -/*----------------------------------------------------------------------------*/ - -/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F413xx || STM32F423xx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F411xE */ - -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ -#if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ -#endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F446xx -----------------------*/ -#if defined(STM32F446xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief AF 0 selection - */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ - -/** - * @brief AF 14 selection - */ -#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros - * @{ - */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions - * @{ - */ -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Constants GPIO Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Macros GPIO Private Macros - * @{ - */ -/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U : 8U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U :\ - ((__GPIOx__) == (GPIOH))? 7U :\ - ((__GPIOx__) == (GPIOI))? 8U :\ - ((__GPIOx__) == (GPIOJ))? 9U : 10U) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U :\ - ((__GPIOx__) == (GPIOF))? 5U :\ - ((__GPIOx__) == (GPIOG))? 6U : 7U) -#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U :\ - ((__GPIOx__) == (GPIOE))? 4U : 7U) -#endif /* STM32F412Vx */ -#if defined(STM32F412Rx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U :\ - ((__GPIOx__) == (GPIOD))? 3U : 7U) -#endif /* STM32F412Rx */ -#if defined(STM32F412Cx) -#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ - ((__GPIOx__) == (GPIOB))? 1U :\ - ((__GPIOx__) == (GPIOC))? 2U : 7U) -#endif /* STM32F412Cx */ - -/** - * @} - */ - -/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function - * @{ - */ -/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ -#if defined(STM32F429xx) || defined(STM32F439xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC)) - -#endif /* STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) - -#endif /* STM32F427xx || STM32F437xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ -#if defined(STM32F407xx) || defined(STM32F417xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F405xx || STM32F415xx */ - -/*----------------------------------------------------------------------------*/ - -/*---------------------------------------- STM32F401xx------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F401xC || STM32F401xE */ -/*----------------------------------------------------------------------------*/ -/*---------------------------------------- STM32F410xx------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/*---------------------------------------- STM32F411xx------------------------*/ -#if defined(STM32F411xE) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ - ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ - ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ - ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) - -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------- STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ - ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ - ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ - ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ - ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ - ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ - ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ - ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ - ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ - ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ - ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ - ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ - ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ - ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ - ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ - ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ - ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ - ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ - ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ - ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ - ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ - ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ - ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ - ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ - ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ - ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ - ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ - ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ - ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) - -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup GPIOEx_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_GPIO_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio_ex.h + * @author MCD Application Team + * @brief Header file of GPIO HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_EX_H +#define __STM32F4xx_HAL_GPIO_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection + * @{ + */ + +/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +/** @brief GPIO_Legacy + */ +#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ +#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ +#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ +#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ +#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F413xx || STM32F423xx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F411xE */ + +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F446xx -----------------------*/ +#if defined(STM32F446xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ +#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ +#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros + * @{ + */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions + * @{ + */ +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Constants GPIO Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Macros GPIO Private Macros + * @{ + */ +/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U : 8U) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U :\ + ((__GPIOx__) == (GPIOI))? 8U :\ + ((__GPIOx__) == (GPIOJ))? 9U : 10U) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U : 7U) +#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F412Vx */ +#if defined(STM32F412Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U : 7U) +#endif /* STM32F412Rx */ +#if defined(STM32F412Cx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F412Cx */ + +/** + * @} + */ + +/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function + * @{ + */ +/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC)) + +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) + +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ + ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ + ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ + ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ + ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------- STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ + ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ + ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ + ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ + ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ + ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h index 7ee95b70..6f3bf714 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h @@ -1,431 +1,431 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.h - * @author MCD Application Team - * @brief Header file of PWR HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_H -#define __STM32F4xx_HAL_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Types PWR Exported Types - * @{ - */ - -/** - * @brief PWR PVD configuration structure definition - */ -typedef struct -{ - uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. - This parameter can be a value of @ref PWR_PVD_detection_level */ - - uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. - This parameter can be a value of @ref PWR_PVD_Mode */ -}PWR_PVDTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWR_Exported_Constants PWR Exported Constants - * @{ - */ - -/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN1 0x00000100U -/** - * @} - */ - -/** @defgroup PWR_PVD_detection_level PWR PVD detection level - * @{ - */ -#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage - (Compare internally to VREFINT) */ -/** - * @} - */ - -/** @defgroup PWR_PVD_Mode PWR PVD Mode - * @{ - */ -#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode - * @{ - */ -#define PWR_MAINREGULATOR_ON 0x00000000U -#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS -/** - * @} - */ - -/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry - * @{ - */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) -/** - * @} - */ - -/** @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 -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWR_Exported_Macro PWR Exported Macro - * @{ - */ - -/** @brief Check PWR flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the PWR's pending flags. - * @param __FLAG__ specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - */ -#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) - -/** - * @brief Enable the PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable the PVD EXTI Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) - -/** - * @brief Disable event on PVD Exti Line 16. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) - -/** - * @brief Enable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Disable the PVD Extended Interrupt Rising Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) - -/** - * @brief Enable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief Disable the PVD Extended Interrupt Falling Trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) - - -/** - * @brief PVD EXTI line configuration: set rising & falling edge trigger. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. - * This parameter can be: - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0U) - -/** - * @brief checks whether the specified PVD Exti interrupt flag is set or not. - * @retval EXTI PVD Line Status. - */ -#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) - -/** - * @brief Clear the PVD Exti flag. - * @retval None. - */ -#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) - -/** - * @brief Generates a Software interrupt on PVD EXTI line. - * @retval None - */ -#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) - -/** - * @} - */ - -/* Include PWR HAL Extension module */ -#include "stm32f4xx_hal_pwr_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -/* Initialization and de-initialization functions *****************************/ -void HAL_PWR_DeInit(void); -void HAL_PWR_EnableBkUpAccess(void); -void HAL_PWR_DisableBkUpAccess(void); -/** - * @} - */ - -/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -/* Peripheral Control functions **********************************************/ -/* PVD configuration */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); -void HAL_PWR_EnablePVD(void); -void HAL_PWR_DisablePVD(void); - -/* WakeUp pins configuration */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); - -/* Low Power modes entry */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); -void HAL_PWR_EnterSTANDBYMode(void); - -/* Power PVD IRQ Handler */ -void HAL_PWR_PVD_IRQHandler(void); -void HAL_PWR_PVDCallback(void); - -/* Cortex System Control functions *******************************************/ -void HAL_PWR_EnableSleepOnExit(void); -void HAL_PWR_DisableSleepOnExit(void); -void HAL_PWR_EnableSEVOnPend(void); -void HAL_PWR_DisableSEVOnPend(void); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWR_Private_Constants PWR Private Constants - * @{ - */ - -/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line - * @{ - */ -#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ -/** - * @} - */ - -/** @defgroup PWR_register_alias_address PWR Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) -#define PWR_CR_OFFSET 0x00U -#define PWR_CSR_OFFSET 0x04U -#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) -#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) -/** - * @} - */ - -/** @defgroup PWR_CR_register_alias PWR CR Register alias address - * @{ - */ -/* --- CR Register ---*/ -/* Alias word address of DBP bit */ -#define DBP_BIT_NUMBER PWR_CR_DBP_Pos -#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) - -/* Alias word address of PVDE bit */ -#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos -#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) - -/* Alias word address of VOS bit */ -#define VOS_BIT_NUMBER PWR_CR_VOS_Pos -#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of EWUP bit */ -#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos -#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) -/** - * @} - */ - -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWR_Private_Macros PWR Private Macros - * @{ - */ - -/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters - * @{ - */ -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ - ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ - ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ - ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) -#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ - ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ - ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ - ((MODE) == PWR_PVD_MODE_NORMAL)) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) -#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_H +#define __STM32F4xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Types PWR Exported Types + * @{ + */ + +/** + * @brief PWR PVD configuration structure definition + */ +typedef struct +{ + uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. + This parameter can be a value of @ref PWR_PVD_detection_level */ + + uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. + This parameter can be a value of @ref PWR_PVD_Mode */ +}PWR_PVDTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN1 0x00000100U +/** + * @} + */ + +/** @defgroup PWR_PVD_detection_level PWR PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 +#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 +#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 +#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 +#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 +#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 +#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 +#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage + (Compare internally to VREFINT) */ +/** + * @} + */ + +/** @defgroup PWR_PVD_Mode PWR PVD Mode + * @{ + */ +#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ +#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ +/** + * @} + */ + + +/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode + * @{ + */ +#define PWR_MAINREGULATOR_ON 0x00000000U +#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry + * @{ + */ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) +/** + * @} + */ + +/** @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 +#define PWR_FLAG_BRR PWR_CSR_BRR +#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_Exported_Macro PWR Exported Macro + * @{ + */ + +/** @brief Check PWR flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event + * was received from the WKUP pin or from the RTC alarm (Alarm A + * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. + * An additional wakeup event is detected if the WKUP pin is enabled + * (by setting the EWUP bit) when the WKUP pin level is already high. + * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was + * resumed from StandBy mode. + * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled + * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode + * For this reason, this bit is equal to 0 after Standby or reset + * until the PVDE bit is set. + * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset + * when the device wakes up from Standby mode or by a system reset + * or power reset. + * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage + * scaling output selection is ready. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the PWR's pending flags. + * @param __FLAG__ specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + */ +#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) + +/** + * @brief Enable the PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable the PVD EXTI Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Disable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Enable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief Disable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief PVD EXTI line configuration: set rising & falling edge trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. + * This parameter can be: + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief checks whether the specified PVD Exti interrupt flag is set or not. + * @retval EXTI PVD Line Status. + */ +#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) + +/** + * @brief Clear the PVD Exti flag. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) + +/** + * @brief Generates a Software interrupt on PVD EXTI line. + * @retval None + */ +#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) + +/** + * @} + */ + +/* Include PWR HAL Extension module */ +#include "stm32f4xx_hal_pwr_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_PWR_DeInit(void); +void HAL_PWR_EnableBkUpAccess(void); +void HAL_PWR_DisableBkUpAccess(void); +/** + * @} + */ + +/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @{ + */ +/* Peripheral Control functions **********************************************/ +/* PVD configuration */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); +void HAL_PWR_EnablePVD(void); +void HAL_PWR_DisablePVD(void); + +/* WakeUp pins configuration */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); + +/* Low Power modes entry */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); +void HAL_PWR_EnterSTANDBYMode(void); + +/* Power PVD IRQ Handler */ +void HAL_PWR_PVD_IRQHandler(void); +void HAL_PWR_PVDCallback(void); + +/* Cortex System Control functions *******************************************/ +void HAL_PWR_EnableSleepOnExit(void); +void HAL_PWR_DisableSleepOnExit(void); +void HAL_PWR_EnableSEVOnPend(void); +void HAL_PWR_DisableSEVOnPend(void); +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWR_Private_Constants PWR Private Constants + * @{ + */ + +/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line + * @{ + */ +#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ +/** + * @} + */ + +/** @defgroup PWR_register_alias_address PWR Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) +#define PWR_CR_OFFSET 0x00U +#define PWR_CSR_OFFSET 0x04U +#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) +#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) +/** + * @} + */ + +/** @defgroup PWR_CR_register_alias PWR CR Register alias address + * @{ + */ +/* --- CR Register ---*/ +/* Alias word address of DBP bit */ +#define DBP_BIT_NUMBER PWR_CR_DBP_Pos +#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) + +/* Alias word address of PVDE bit */ +#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos +#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) + +/* Alias word address of VOS bit */ +#define VOS_BIT_NUMBER PWR_CR_VOS_Pos +#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of EWUP bit */ +#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos +#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWR_Private_Macros PWR Private Macros + * @{ + */ + +/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters + * @{ + */ +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ + ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ + ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ + ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) +#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ + ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ + ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ + ((MODE) == PWR_PVD_MODE_NORMAL)) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) +#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h index 9c4f9876..10e017a1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h @@ -1,344 +1,344 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.h - * @author MCD Application Team - * @brief Header file of PWR HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_PWR_EX_H -#define __STM32F4xx_HAL_PWR_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup PWREx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode - * @{ - */ -#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS -#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) -/** - * @} - */ - -/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag - * @{ - */ -#define PWR_FLAG_ODRDY PWR_CSR_ODRDY -#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY -#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ -#else -#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to - 180 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to - 168 MHz by activating the over-drive mode. */ -#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ -/** - * @} - */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins - * @{ - */ -#define PWR_WAKEUP_PIN2 0x00000080U -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 0x00000040U -#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Constants PWREx Exported Constants - * @{ - */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#else -/** @brief macros configure the main internal regulator output voltage. - * @param __REGULATOR__ specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - * @retval None - */ -#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ - __IO uint32_t tmpreg = 0x00U; \ - MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to enable or disable the Over drive mode. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Over drive switching. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) -#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) - -/** @brief Macros to enable or disable the Under drive mode. - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode. - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - */ -#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) -#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) - -/** @brief Check PWR flag is set or not. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode - * is ready - * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode - * switching is ready - * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode - * is enabled in Stop mode - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the Under-Drive Ready flag. - * @note These macros can be used only for STM32F42xx/STM3243xx devices. - */ -#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @addtogroup PWREx_Exported_Functions_Group1 - * @{ - */ -void HAL_PWREx_EnableFlashPowerDown(void); -void HAL_PWREx_DisableFlashPowerDown(void); -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); -uint32_t HAL_PWREx_GetVoltageRange(void); -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -void HAL_PWREx_EnableMainRegulatorLowVoltage(void); -void HAL_PWREx_DisableMainRegulatorLowVoltage(void); -void HAL_PWREx_EnableLowRegulatorLowVoltage(void); -void HAL_PWREx_DisableLowRegulatorLowVoltage(void); -#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup PWREx_Private_Constants PWREx Private Constants - * @{ - */ - -/** @defgroup PWREx_register_alias_address PWREx Register alias address - * @{ - */ -/* ------------- PWR registers bit address in the alias region ---------------*/ -/* --- CR Register ---*/ -/* Alias word address of FPDS bit */ -#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos -#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) - -/* Alias word address of ODEN bit */ -#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos -#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) - -/* Alias word address of ODSWEN bit */ -#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos -#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) - -/* Alias word address of MRLVDS bit */ -#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos -#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) - -/* Alias word address of LPLVDS bit */ -#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos -#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) - - /** - * @} - */ - -/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address - * @{ - */ -/* --- CSR Register ---*/ -/* Alias word address of BRE bit */ -#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos -#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PWREx_Private_Macros PWREx Private Macros - * @{ - */ - -/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ - ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) -#else -#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ - ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) -#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ - -#if defined(STM32F446xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ - ((PIN) == PWR_WAKEUP_PIN3)) -#else -#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) -#endif /* STM32F446xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F4xx_HAL_PWR_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.h + * @author MCD Application Team + * @brief Header file of PWR HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_EX_H +#define __STM32F4xx_HAL_PWR_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWREx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode + * @{ + */ +#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS +#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) +/** + * @} + */ + +/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag + * @{ + */ +#define PWR_FLAG_ODRDY PWR_CSR_ODRDY +#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY +#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ +#else +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to + 180 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to + 168 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ +/** + * @} + */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN2 0x00000080U +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define PWR_WAKEUP_PIN3 0x00000040U +#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#else +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to enable or disable the Over drive mode. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Over drive switching. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Under drive mode. + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode. + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + */ +#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) +#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) + +/** @brief Check PWR flag is set or not. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode + * is ready + * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode + * switching is ready + * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode + * is enabled in Stop mode + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the Under-Drive Ready flag. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @addtogroup PWREx_Exported_Functions_Group1 + * @{ + */ +void HAL_PWREx_EnableFlashPowerDown(void); +void HAL_PWREx_DisableFlashPowerDown(void); +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); +uint32_t HAL_PWREx_GetVoltageRange(void); +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +void HAL_PWREx_EnableMainRegulatorLowVoltage(void); +void HAL_PWREx_DisableMainRegulatorLowVoltage(void); +void HAL_PWREx_EnableLowRegulatorLowVoltage(void); +void HAL_PWREx_DisableLowRegulatorLowVoltage(void); +#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWREx_Private_Constants PWREx Private Constants + * @{ + */ + +/** @defgroup PWREx_register_alias_address PWREx Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +/* --- CR Register ---*/ +/* Alias word address of FPDS bit */ +#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos +#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) + +/* Alias word address of ODEN bit */ +#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos +#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) + +/* Alias word address of ODSWEN bit */ +#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos +#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) + +/* Alias word address of MRLVDS bit */ +#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos +#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) + +/* Alias word address of LPLVDS bit */ +#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos +#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) + + /** + * @} + */ + +/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of BRE bit */ +#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos +#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWREx_Private_Macros PWREx Private Macros + * @{ + */ + +/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) +#else +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F446xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ + ((PIN) == PWR_WAKEUP_PIN3)) +#else +#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) +#endif /* STM32F446xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h index 44553fba..36a639b4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h @@ -1,1464 +1,1464 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.h - * @author MCD Application Team - * @brief Header file of RCC HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_H -#define __STM32F4xx_HAL_RCC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/* Include RCC HAL Extended module */ -/* (include on top of file since RCC structures are defined in extended file) */ -#include "stm32f4xx_hal_rcc_ex.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Types RCC Exported Types - * @{ - */ - -/** - * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition - */ -typedef struct -{ - uint32_t OscillatorType; /*!< The oscillators to be configured. - This parameter can be a value of @ref RCC_Oscillator_Type */ - - uint32_t HSEState; /*!< The new state of the HSE. - This parameter can be a value of @ref RCC_HSE_Config */ - - uint32_t LSEState; /*!< The new state of the LSE. - This parameter can be a value of @ref RCC_LSE_Config */ - - uint32_t HSIState; /*!< The new state of the HSI. - This parameter can be a value of @ref RCC_HSI_Config */ - - uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ - - uint32_t LSIState; /*!< The new state of the LSI. - This parameter can be a value of @ref RCC_LSI_Config */ - - RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ -}RCC_OscInitTypeDef; - -/** - * @brief RCC System, AHB and APB busses clock configuration structure definition - */ -typedef struct -{ - uint32_t ClockType; /*!< The clock to be configured. - This parameter can be a value of @ref RCC_System_Clock_Type */ - - uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. - This parameter can be a value of @ref RCC_System_Clock_Source */ - - uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). - This parameter can be a value of @ref RCC_AHB_Clock_Source */ - - uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - - uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). - This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ - -}RCC_ClkInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCC_Exported_Constants RCC Exported Constants - * @{ - */ - -/** @defgroup RCC_Oscillator_Type Oscillator Type - * @{ - */ -#define RCC_OSCILLATORTYPE_NONE 0x00000000U -#define RCC_OSCILLATORTYPE_HSE 0x00000001U -#define RCC_OSCILLATORTYPE_HSI 0x00000002U -#define RCC_OSCILLATORTYPE_LSE 0x00000004U -#define RCC_OSCILLATORTYPE_LSI 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_HSE_Config HSE Config - * @{ - */ -#define RCC_HSE_OFF 0x00000000U -#define RCC_HSE_ON RCC_CR_HSEON -#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Config LSE Config - * @{ - */ -#define RCC_LSE_OFF 0x00000000U -#define RCC_LSE_ON RCC_BDCR_LSEON -#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Config HSI Config - * @{ - */ -#define RCC_HSI_OFF ((uint8_t)0x00) -#define RCC_HSI_ON ((uint8_t)0x01) - -#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ -/** - * @} - */ - -/** @defgroup RCC_LSI_Config LSI Config - * @{ - */ -#define RCC_LSI_OFF ((uint8_t)0x00) -#define RCC_LSI_ON ((uint8_t)0x01) -/** - * @} - */ - -/** @defgroup RCC_PLL_Config PLL Config - * @{ - */ -#define RCC_PLL_NONE ((uint8_t)0x00) -#define RCC_PLL_OFF ((uint8_t)0x01) -#define RCC_PLL_ON ((uint8_t)0x02) -/** - * @} - */ - -/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider - * @{ - */ -#define RCC_PLLP_DIV2 0x00000002U -#define RCC_PLLP_DIV4 0x00000004U -#define RCC_PLLP_DIV6 0x00000006U -#define RCC_PLLP_DIV8 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source PLL Clock Source - * @{ - */ -#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI -#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Type System Clock Type - * @{ - */ -#define RCC_CLOCKTYPE_SYSCLK 0x00000001U -#define RCC_CLOCKTYPE_HCLK 0x00000002U -#define RCC_CLOCKTYPE_PCLK1 0x00000004U -#define RCC_CLOCKTYPE_PCLK2 0x00000008U -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source System Clock Source - * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI -#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE -#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL -#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status - * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for - * STM32F446xx devices. - * @{ - */ -#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ -#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source AHB Clock Source - * @{ - */ -#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 -#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 -#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 -#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 -#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 -#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 -#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 -#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 -#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source - * @{ - */ -#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 -#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 -#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 -#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 -#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source RTC Clock Source - * @{ - */ -#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U -#define RCC_RTCCLKSOURCE_LSE 0x00000100U -#define RCC_RTCCLKSOURCE_LSI 0x00000200U -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U -#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U -#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U -#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U -#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U -#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U -#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U -#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U -#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U -#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U -#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U -#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U -#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U -#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U -#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U -#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U -#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U -#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U -#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U -#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U -#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U -#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U -#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U -#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U -#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U -/** - * @} - */ - -/** @defgroup RCC_MCO_Index MCO Index - * @{ - */ -#define RCC_MCO1 0x00000000U -#define RCC_MCO2 0x00000001U -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source - * @{ - */ -#define RCC_MCO1SOURCE_HSI 0x00000000U -#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 -#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 -#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 -/** - * @} - */ - -/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler - * @{ - */ -#define RCC_MCODIV_1 0x00000000U -#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 -#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) -#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE -/** - * @} - */ - -/** @defgroup RCC_Interrupt Interrupts - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup RCC_Flag Flags - * Elements values convention: 0XXYYYYYb - * - YYYYY : Flag position in the register - * - 0XX : Register index - * - 01: CR register - * - 10: BDCR register - * - 11: CSR register - * @{ - */ -/* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) - -/* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41) - -/* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCC_Exported_Macros RCC Exported Macros - * @{ - */ - -/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) -#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) -#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) -#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) -#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) -#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) -#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) -#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) -#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) -#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) -#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) - -#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) -#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) -#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) -#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) -#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) -#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_PWR_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) -#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) -#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) -#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) -#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) -#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) -#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) -#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) -#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) -#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) -#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) -#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) -#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) - -#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) -#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) -#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) -#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) -#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) -#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) -#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) -#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) -#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) -#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) -#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) -#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) -#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) -#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) -#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) -#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) -#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) -#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) -#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) -#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) - -#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) -#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) -#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) -#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) -#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) -#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) -#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) -#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) -#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) -#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) -#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) -#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) -#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) -#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) -#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) -#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) -#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) -#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) -#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) -#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) -#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) -#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) -#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) -#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) -#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) -#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) - -#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) -#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) -#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) -#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) -#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) -#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) - -#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) -#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) -#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) -#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) -#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) -#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) -#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) -/** - * @} - */ - -/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) - -#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) -#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) -#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) -#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) -#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) -#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) -#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) -#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) -/** - * @} - */ - -/** @defgroup RCC_HSI_Configuration HSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wake-up from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - */ -#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) -#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) - -/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param __HSICalibrationValue__ specifies the calibration trimming value. - * (default is RCC_HSICALIBRATION_DEFAULT). - * This parameter must be a number between 0 and 0x1F. - */ -#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ - RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) -/** - * @} - */ - -/** @defgroup RCC_LSI_Configuration LSI Configuration - * @{ - */ - -/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - */ -#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) -#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_HSE_Configuration HSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External High Speed oscillator (HSE). - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. - * User should request a transition to HSE Off first and then HSE On or HSE Bypass. - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param __STATE__ specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator. - * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_HSE_CONFIG(__STATE__) \ - do { \ - if ((__STATE__) == RCC_HSE_ON) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else if ((__STATE__) == RCC_HSE_BYPASS) \ - { \ - SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ - SET_BIT(RCC->CR, RCC_CR_HSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration LSE Configuration - * @{ - */ - -/** - * @brief Macro to configure the External Low Speed oscillator (LSE). - * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. - * User should request a transition to LSE Off first and then LSE On or LSE Bypass. - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * HAL_PWR_EnableBkUpAccess() function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param __STATE__ specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator. - * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. - */ -#define __HAL_RCC_LSE_CONFIG(__STATE__) \ - do { \ - if((__STATE__) == RCC_LSE_ON) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else if((__STATE__) == RCC_LSE_BYPASS) \ - { \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - } \ - else \ - { \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ - } \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration - * @{ - */ - -/** @brief Macros to enable or disable the RTC clock. - * @note These macros must be used only after the RTC clock source was selected. - */ -#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) -#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) - -/** @brief Macros to configure the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using the Power Backup Access macro before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by - * a Power On Reset (POR). - * @param __RTCCLKSource__ specifies the RTC clock source. - * This parameter can be one of the following values: - @arg @ref RCC_RTCCLKSOURCE_NO_CLK: No clock selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSE: LSE selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_LSI: LSI selected as RTC clock. - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected - * as RTC clock, where x:[2,31] - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wake-up source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - */ -#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ - MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) - -#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ - RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while(0U) - -/** @brief Macro to get the RTC clock source. - * @retval The clock source can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() - */ -#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) - -/** - * @brief Get the RTC and HSE clock divider (RTCPRE). - * @retval Returned value can be one of the following values: - * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected - * as RTC clock, where x:[2,31] - */ -#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) - -/** @brief Macros to force or release the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - */ -#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) -#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) -/** - * @} - */ - -/** @defgroup RCC_PLL_Configuration PLL Configuration - * @{ - */ - -/** @brief Macros to enable or disable the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) -#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) - -/** @brief Macro to configure the PLL clock source. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLSOURCE__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * - */ -#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) - -/** @brief Macro to configure the PLL multiplication factor. - * @note This function must be used only when the main PLL is disabled. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - */ -#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) -/** - * @} - */ - -/** @defgroup RCC_Get_Clock_source Get Clock source - * @{ - */ -/** - * @brief Macro to configure the system clock source. - * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. - * This parameter can be one of the following values: - * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. - * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This - * parameter is available only for STM32F446xx devices. - */ -#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) - -/** @brief Macro to get the clock source used as system clock. - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. - * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter - * is available only for STM32F446xx devices. - */ -#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) - -/** @brief Macro to get the oscillator used as PLL clock source. - * @retval The oscillator used as PLL clock source. The returned value can be one - * of the following: - * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. - * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. - */ -#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) -/** - * @} - */ - -/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config - * @{ - */ - -/** @brief Macro to configure the MCO1 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - */ -#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) - -/** @brief Macro to configure the MCO2 clock. - * @param __MCOCLKSOURCE__ specifies the MCO clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param __MCODIV__ specifies the MCO clock prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have - * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - */ -#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); -/** - * @} - */ - -/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management - * @brief macros to manage the specified RCC Flags and interrupts. - * @{ - */ - -/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) - -/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable - * the selected interrupts). - * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - */ -#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) - -/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] - * bits to clear the selected interrupt pending bits. - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - */ -#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) - -/** @brief Check the RCC's interrupt has occurred or not. - * @param __INTERRUPT__ specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt. - * @arg RCC_IT_LSERDY: LSE ready interrupt. - * @arg RCC_IT_HSIRDY: HSI ready interrupt. - * @arg RCC_IT_HSERDY: HSE ready interrupt. - * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, - * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. - */ -#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) - -/** @brief Check RCC flag is set or not. - * @param __FLAG__ specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. - * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. - * @arg RCC_FLAG_PINRST: Pin reset. - * @arg RCC_FLAG_PORRST: POR/PDR reset. - * @arg RCC_FLAG_SFTRST: Software reset. - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. - * @arg RCC_FLAG_LPWRRST: Low Power reset. - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ - /** @addtogroup RCC_Exported_Functions - * @{ - */ - -/** @addtogroup RCC_Exported_Functions_Group1 - * @{ - */ -/* Initialization and de-initialization functions ******************************/ -HAL_StatusTypeDef HAL_RCC_DeInit(void); -HAL_StatusTypeDef HAL_RCC_OscConfig(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); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Constants RCC Private Constants - * @{ - */ - -/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register --- */ -/* Alias word address of HSION bit */ -#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) -#define RCC_HSION_BIT_NUMBER 0x00U -#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) -/* Alias word address of CSSON bit */ -#define RCC_CSSON_BIT_NUMBER 0x13U -#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) -/* Alias word address of PLLON bit */ -#define RCC_PLLON_BIT_NUMBER 0x18U -#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) - -/* --- BDCR Register --- */ -/* Alias word address of RTCEN bit */ -#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) -#define RCC_RTCEN_BIT_NUMBER 0x0FU -#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) -/* Alias word address of BDRST bit */ -#define RCC_BDRST_BIT_NUMBER 0x10U -#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) - -/* --- CSR Register --- */ -/* Alias word address of LSION bit */ -#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) -#define RCC_LSION_BIT_NUMBER 0x00U -#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS 0x40023802U - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) - -/* BDCR register base address */ -#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) - -#define RCC_DBP_TIMEOUT_VALUE 2U -#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT - -#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ -#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCC_Private_Macros RCC Private Macros - * @{ - */ - -/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) - -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_BYPASS)) - -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_BYPASS)) - -#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) - -#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) - -#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) - -#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ - ((SOURCE) == RCC_PLLSOURCE_HSE)) - -#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ - ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) - -#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ - ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) - -#define IS_RCC_PLLM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) - -#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ - ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ - ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ - ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ - ((HCLK) == RCC_SYSCLK_DIV512)) - -#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) - -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ - ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ - ((PCLK) == RCC_HCLK_DIV16)) - -#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) - -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ - ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) - -#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ - ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ - ((DIV) == RCC_MCODIV_5)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_H +#define __STM32F4xx_HAL_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/* Include RCC HAL Extended module */ +/* (include on top of file since RCC structures are defined in extended file) */ +#include "stm32f4xx_hal_rcc_ex.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition + */ +typedef struct +{ + uint32_t OscillatorType; /*!< The oscillators to be configured. + This parameter can be a value of @ref RCC_Oscillator_Type */ + + uint32_t HSEState; /*!< The new state of the HSE. + This parameter can be a value of @ref RCC_HSE_Config */ + + uint32_t LSEState; /*!< The new state of the LSE. + This parameter can be a value of @ref RCC_LSE_Config */ + + uint32_t HSIState; /*!< The new state of the HSI. + This parameter can be a value of @ref RCC_HSI_Config */ + + uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ + + uint32_t LSIState; /*!< The new state of the LSI. + This parameter can be a value of @ref RCC_LSI_Config */ + + RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ +}RCC_OscInitTypeDef; + +/** + * @brief RCC System, AHB and APB busses clock configuration structure definition + */ +typedef struct +{ + uint32_t ClockType; /*!< The clock to be configured. + This parameter can be a value of @ref RCC_System_Clock_Type */ + + uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. + This parameter can be a value of @ref RCC_System_Clock_Source */ + + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_AHB_Clock_Source */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + +}RCC_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_Oscillator_Type Oscillator Type + * @{ + */ +#define RCC_OSCILLATORTYPE_NONE 0x00000000U +#define RCC_OSCILLATORTYPE_HSE 0x00000001U +#define RCC_OSCILLATORTYPE_HSI 0x00000002U +#define RCC_OSCILLATORTYPE_LSE 0x00000004U +#define RCC_OSCILLATORTYPE_LSI 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_HSE_Config HSE Config + * @{ + */ +#define RCC_HSE_OFF 0x00000000U +#define RCC_HSE_ON RCC_CR_HSEON +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF 0x00000000U +#define RCC_LSE_ON RCC_BDCR_LSEON +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF ((uint8_t)0x00) +#define RCC_HSI_ON ((uint8_t)0x01) + +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF ((uint8_t)0x00) +#define RCC_LSI_ON ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE ((uint8_t)0x00) +#define RCC_PLL_OFF ((uint8_t)0x01) +#define RCC_PLL_ON ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider + * @{ + */ +#define RCC_PLLP_DIV2 0x00000002U +#define RCC_PLLP_DIV4 0x00000004U +#define RCC_PLLP_DIV6 0x00000006U +#define RCC_PLLP_DIV8 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_PLL_Clock_Source PLL Clock Source + * @{ + */ +#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI +#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U +#define RCC_CLOCKTYPE_HCLK 0x00000002U +#define RCC_CLOCKTYPE_PCLK1 0x00000004U +#define RCC_CLOCKTYPE_PCLK2 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL +#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U +#define RCC_RTCCLKSOURCE_LSE 0x00000100U +#define RCC_RTCCLKSOURCE_LSI 0x00000200U +#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U +#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U +#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U +#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U +#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U +#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U +#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U +#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U +#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U +#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U +#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U +#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U +#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U +#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U +#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U +#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U +#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U +#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U +#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U +#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U +#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U +/** + * @} + */ + +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 0x00000000U +#define RCC_MCO2 0x00000001U +/** + * @} + */ + +/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_HSI 0x00000000U +#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 +#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 +#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 +/** + * @} + */ + +/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler + * @{ + */ +#define RCC_MCODIV_1 0x00000000U +#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 +#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) +#define RCC_IT_CSS ((uint8_t)0x80) +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: 0XXYYYYYb + * - YYYYY : Flag position in the register + * - 0XX : Register index + * - 01: CR register + * - 10: BDCR register + * - 11: CSR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)0x41) + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_BORRST ((uint8_t)0x79) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) +#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) +#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) + +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) +#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) +#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) + +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) +#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) +#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) +#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) +#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) +#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) +#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) + +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) +#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) +#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) +#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) + +#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) + +#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) + +#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Configuration HSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). + * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. + * It is used (enabled by hardware) as system clock source after startup + * from Reset, wake-up from STOP and STANDBY mode, or in case of failure + * of the HSE used directly or indirectly as system clock (if the Clock + * Security System CSS is enabled). + * @note HSI can not be stopped if it is used as system clock source. In this case, + * you have to select another source of the system clock then stop the HSI. + * @note After enabling the HSI, the application software should wait on HSIRDY + * flag to be set indicating that HSI clock is stable and can be used as + * system clock source. + * This parameter can be: ENABLE or DISABLE. + * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator + * clock cycles. + */ +#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) +#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) + +/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. + * @note The calibration is used to compensate for the variations in voltage + * and temperature that influence the frequency of the internal HSI RC. + * @param __HSICalibrationValue__ specifies the calibration trimming value. + * (default is RCC_HSICALIBRATION_DEFAULT). + * This parameter must be a number between 0 and 0x1F. + */ +#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ + RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) +/** + * @} + */ + +/** @defgroup RCC_LSI_Configuration LSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). + * @note After enabling the LSI, the application software should wait on + * LSIRDY flag to be set indicating that LSI clock is stable and can + * be used to clock the IWDG and/or the RTC. + * @note LSI can not be disabled if the IWDG is running. + * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator + * clock cycles. + */ +#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) +#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_HSE_Configuration HSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External High Speed oscillator (HSE). + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. + * User should request a transition to HSE Off first and then HSE On or HSE Bypass. + * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application + * software should wait on HSERDY flag to be set indicating that HSE clock + * is stable and can be used to clock the PLL and/or system clock. + * @note HSE state can not be changed if it is used directly or through the + * PLL as system clock. In this case, you have to select another source + * of the system clock then change the HSE state (ex. disable it). + * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. + * @note This function reset the CSSON bit, so if the clock security system(CSS) + * was previously enabled you have to enable it again after calling this + * function. + * @param __STATE__ specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg RCC_HSE_ON: turn ON the HSE oscillator. + * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_HSE_CONFIG(__STATE__) \ + do { \ + if ((__STATE__) == RCC_HSE_ON) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else if ((__STATE__) == RCC_HSE_BYPASS) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_LSE_Configuration LSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External Low Speed oscillator (LSE). + * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. + * User should request a transition to LSE Off first and then LSE On or LSE Bypass. + * @note As the LSE is in the Backup domain and write access is denied to + * this domain after reset, you have to enable write access using + * HAL_PWR_EnableBkUpAccess() function before to configure the LSE + * (to be done once after reset). + * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application + * software should wait on LSERDY flag to be set indicating that LSE clock + * is stable and can be used to clock the RTC. + * @param __STATE__ specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg RCC_LSE_ON: turn ON the LSE oscillator. + * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_LSE_CONFIG(__STATE__) \ + do { \ + if((__STATE__) == RCC_LSE_ON) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else if((__STATE__) == RCC_LSE_BYPASS) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration + * @{ + */ + +/** @brief Macros to enable or disable the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) +#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) + +/** @brief Macros to configure the RTC clock (RTCCLK). + * @note As the RTC clock configuration bits are in the Backup domain and write + * access is denied to this domain after reset, you have to enable write + * access using the Power Backup Access macro before to configure + * the RTC clock source (to be done once after reset). + * @note Once the RTC clock is configured it can't be changed unless the + * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by + * a Power On Reset (POR). + * @param __RTCCLKSource__ specifies the RTC clock source. + * This parameter can be one of the following values: + @arg @ref RCC_RTCCLKSOURCE_NO_CLK: No clock selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSE: LSE selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSI: LSI selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected + * as RTC clock, where x:[2,31] + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wake-up source. + * However, when the HSE clock is used as RTC clock source, the RTC + * cannot be used in STOP and STANDBY modes. + * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as + * RTC clock source). + */ +#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) + +#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ + RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ + } while(0U) + +/** @brief Macro to get the RTC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** + * @brief Get the RTC and HSE clock divider (RTCPRE). + * @retval Returned value can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX: HSE clock divided by x selected + * as RTC clock, where x:[2,31] + */ +#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) + +/** @brief Macros to force or release the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_CSR register. + * @note The BKPSRAM is not affected by this reset. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macros to enable or disable the main PLL. + * @note After enabling the main PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The main PLL can not be disabled if it is used as system clock source + * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + +/** @brief Macro to configure the PLL clock source. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLSOURCE__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * + */ +#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) + +/** @brief Macro to configure the PLL multiplication factor. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * + */ +#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ +/** + * @brief Macro to configure the system clock source. + * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This + * parameter is available only for STM32F446xx devices. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) + +/** @brief Macro to get the clock source used as system clock. + * @retval The clock source used as system clock. The returned value can be one + * of the following: + * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter + * is available only for STM32F446xx devices. + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) + +/** @brief Macro to get the oscillator used as PLL clock source. + * @retval The oscillator used as PLL clock source. The returned value can be one + * of the following: + * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. + * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +/** @brief Macro to configure the MCO1 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + */ +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) + +/** @brief Macro to configure the MCO2 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have + * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + */ +#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] + * bits to clear the selected interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + */ +#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) + +/** @brief Check the RCC's interrupt has occurred or not. + * @param __INTERRUPT__ specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, + * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) + +/** @brief Check RCC flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. + * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. + * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. + * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. + * @arg RCC_FLAG_PINRST: Pin reset. + * @arg RCC_FLAG_PORRST: POR/PDR reset. + * @arg RCC_FLAG_SFTRST: Software reset. + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. + * @arg RCC_FLAG_LPWRRST: Low Power reset. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define RCC_FLAG_MASK ((uint8_t)0x1FU) +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + /** @addtogroup RCC_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions ******************************/ +HAL_StatusTypeDef HAL_RCC_DeInit(void); +HAL_StatusTypeDef HAL_RCC_OscConfig(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); + +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ + +/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) +/* --- CR Register --- */ +/* Alias word address of HSION bit */ +#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) +#define RCC_HSION_BIT_NUMBER 0x00U +#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) +/* Alias word address of CSSON bit */ +#define RCC_CSSON_BIT_NUMBER 0x13U +#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) +/* Alias word address of PLLON bit */ +#define RCC_PLLON_BIT_NUMBER 0x18U +#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) + +/* --- BDCR Register --- */ +/* Alias word address of RTCEN bit */ +#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) +#define RCC_RTCEN_BIT_NUMBER 0x0FU +#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) +/* Alias word address of BDRST bit */ +#define RCC_BDRST_BIT_NUMBER 0x10U +#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) + +/* --- CSR Register --- */ +/* Alias word address of LSION bit */ +#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) +#define RCC_LSION_BIT_NUMBER 0x00U +#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) + +/* CR register byte 3 (Bits[23:16]) base address */ +#define RCC_CR_BYTE2_ADDRESS 0x40023802U + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) + +/* BDCR register base address */ +#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) + +#define RCC_DBP_TIMEOUT_VALUE 2U +#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT + +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ + +/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) + +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_BYPASS)) + +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_BYPASS)) + +#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) + +#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) + +#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) + +#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ + ((SOURCE) == RCC_PLLSOURCE_HSE)) + +#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) + +#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) + +#define IS_RCC_PLLM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) + +#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ + ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ + ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ + ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ + ((HCLK) == RCC_SYSCLK_DIV512)) + +#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) + +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ + ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ + ((PCLK) == RCC_HCLK_DIV16)) + +#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) + +#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) + +#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ + ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ + ((DIV) == RCC_MCODIV_5)) +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h index 1412b9fc..0b8152b1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h @@ -1,7138 +1,7138 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.h - * @author MCD Application Team - * @brief Header file of RCC HAL Extension module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_RCC_EX_H -#define __STM32F4xx_HAL_RCC_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup RCCEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Types RCCEx Exported Types - * @{ - */ - -/** - * @brief RCC PLL configuration structure definition - */ -typedef struct -{ - uint32_t PLLState; /*!< The new state of the PLL. - This parameter can be a value of @ref RCC_PLL_Config */ - - uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. - This parameter must be a value of @ref RCC_PLL_Clock_Source */ - - uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ - - uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - except for STM32F411xE devices where the Min_Data = 192 */ - - uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). - This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ - - uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx - and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -}RCC_PLLInitTypeDef; - -#if defined(STM32F446xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. - This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIM; /*!< Spcifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ -}RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ - - uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. - This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. - This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F446xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLL is selected as Clock Source SAI */ - - uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ - - uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. - This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ - - uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ - - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ - - uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ - -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ - - uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. - This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ - - uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. - This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ - - uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ - - uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection - This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ -#endif /* STM32F413xx || STM32F423xx */ - - uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. - This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ -}RCC_PLLI2SInitTypeDef; - -/** - * @brief PLLSAI Clock structure definition - */ -typedef struct -{ - uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. - This parameter is only available in STM32F469xx/STM32F479xx devices. - This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ -#endif /* STM32F469xx || STM32F479xx */ - - uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 15. - This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ - - uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ - -}RCC_PLLSAIInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ - - uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLI2S is selected as Clock Source SAI */ - - uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. - This parameter must be a number between Min_Data = 1 and Max_Data = 32 - This parameter will be used only when PLLSAI is selected as Clock Source SAI */ - - uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. - This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ - - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#if defined(STM32F469xx) || defined(STM32F479xx) - uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. - This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ - - uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. - This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ -#endif /* STM32F469xx || STM32F479xx */ -}RCC_PeriphCLKInitTypeDef; - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief PLLI2S Clock structure definition - */ -typedef struct -{ -#if defined(STM32F411xE) - uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ -#endif /* STM32F411xE */ - - uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. - This parameter must be a number between Min_Data = 50 and Max_Data = 432 - Except for STM32F411xE devices where the Min_Data = 192. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. - This parameter must be a number between Min_Data = 2 and Max_Data = 7. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - -}RCC_PLLI2SInitTypeDef; - -/** - * @brief RCC extended clocks structure definition - */ -typedef struct -{ - uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. - This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ - - RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. - This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ - - uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. - This parameter can be a value of @ref RCC_RTC_Clock_Source */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. - This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -}RCC_PeriphCLKInitTypeDef; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants - * @{ - */ - -/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection - * @{ - */ -/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_TIM 0x00000004U -#define RCC_PERIPHCLK_RTC 0x00000008U -#define RCC_PERIPHCLK_FMPI2C1 0x00000010U -#define RCC_PERIPHCLK_CLK48 0x00000020U -#define RCC_PERIPHCLK_SDIO 0x00000040U -#define RCC_PERIPHCLK_PLLI2S 0x00000080U -#define RCC_PERIPHCLK_DFSDM1 0x00000100U -#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U -#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 0x00000400U -#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U -#define RCC_PERIPHCLK_LPTIM1 0x00001000U -#define RCC_PERIPHCLK_SAIA 0x00002000U -#define RCC_PERIPHCLK_SAIB 0x00004000U -#endif /* STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_TIM 0x00000002U -#define RCC_PERIPHCLK_RTC 0x00000004U -#define RCC_PERIPHCLK_FMPI2C1 0x00000008U -#define RCC_PERIPHCLK_LPTIM1 0x00000010U -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ -#if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 0x00000001U -#define RCC_PERIPHCLK_I2S_APB2 0x00000002U -#define RCC_PERIPHCLK_SAI1 0x00000004U -#define RCC_PERIPHCLK_SAI2 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_CEC 0x00000040U -#define RCC_PERIPHCLK_FMPI2C1 0x00000080U -#define RCC_PERIPHCLK_CLK48 0x00000100U -#define RCC_PERIPHCLK_SDIO 0x00000200U -#define RCC_PERIPHCLK_SPDIFRX 0x00000400U -#define RCC_PERIPHCLK_PLLI2S 0x00000800U -#endif /* STM32F446xx */ -/*-----------------------------------------------------------------------------*/ - -/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ -#if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#define RCC_PERIPHCLK_CLK48 0x00000080U -#define RCC_PERIPHCLK_SDIO 0x00000100U -#endif /* STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U -#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U -#define RCC_PERIPHCLK_LTDC 0x00000008U -#define RCC_PERIPHCLK_TIM 0x00000010U -#define RCC_PERIPHCLK_RTC 0x00000020U -#define RCC_PERIPHCLK_PLLI2S 0x00000040U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -/*----------------------------------------------------------------------------*/ - -/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S 0x00000001U -#define RCC_PERIPHCLK_RTC 0x00000002U -#define RCC_PERIPHCLK_PLLI2S 0x00000004U -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM 0x00000008U -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -/*----------------------------------------------------------------------------*/ -/** - * @} - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source - * @{ - */ -#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SCLKSOURCE_EXT 0x00000001U -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR - * @{ - */ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 0x00000000U -#define RCC_PLLSAIDIVR_4 0x00010000U -#define RCC_PLLSAIDIVR_8 0x00020000U -#define RCC_PLLSAIDIVR_16 0x00030000U -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 0x00000002U -#define RCC_PLLI2SP_DIV4 0x00000004U -#define RCC_PLLI2SP_DIV6 0x00000006U -#define RCC_PLLI2SP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider - * @{ - */ -#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 0x00000002U -#define RCC_PLLSAIP_DIV4 0x00000004U -#define RCC_PLLSAIP_DIV6 0x00000006U -#define RCC_PLLSAIP_DIV8 0x00000008U -#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U -#define RCC_SAIACLKSOURCE_EXT 0x00200000U -/** - * @} - */ - -/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U -#define RCC_SAIBCLKSOURCE_EXT 0x00800000U -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source - * @{ - */ -#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U -#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) -/** - * @} - */ -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source - * @{ - */ -#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) -#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) -#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source - * @{ - */ -#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U -#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) -#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) -#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source - * @{ - */ -#define RCC_CECCLKSOURCE_HSI 0x00000000U -#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source - * @{ - */ -#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) -/** - * @} - */ - -#endif /* STM32F446xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source - * @{ - */ -#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) -#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) -#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source - * @{ - */ -#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) -#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) -#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ - - -/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source - * @{ - */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source - * @{ - */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source - * @{ - */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U -#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) -/** - * @} - */ - -/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source - * @{ - */ -#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source - * @{ - */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) -/** - * @} - */ - -/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source - * @{ - */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source - * @{ - */ -#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) -/** - * @} - */ - -/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source - * @{ - */ -#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U -#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - -/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source - * @{ - */ -#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U -#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) -#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) -/** - * @} - */ - -/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source - * @{ - */ -#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) -/** - * @} - */ - -/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source - * @{ - */ -#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U -#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) -#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) -#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection - * @{ - */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ - STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection - * @{ - */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) -/** - * @} - */ -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ - STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source - * @{ - */ -#define RCC_MCO2SOURCE_SYSCLK 0x00000000U -#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 -#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 -#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 -/** - * @} - */ -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros - * @{ - */ -/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) -#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) -#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) - -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) -#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) -#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) -#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) -#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ - #define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) - -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) -#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) -#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) -#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) -#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) -#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) -#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) -#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) -#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) -#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) - -#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) - -#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) - -#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) -#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) -#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) -#endif /* STM32F469xx || STM32F479xx */ -/** - * @} - */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ETH_CLK_ENABLE() do { \ - __HAL_RCC_ETHMAC_CLK_ENABLE(); \ - __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ - __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0U) - -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) -#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) -#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) -#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) -#define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0U) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#if defined(STM32F407xx)|| defined(STM32F417xx) -/** - * @brief Enable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) -#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) -/** - * @brief Disable ETHERNET clock. - */ -#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) -#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) -#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) -#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) -#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ - __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) -#endif /* STM32F407xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_HASH_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) -#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) -#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) - -#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) -#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) - /** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) -#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) - -#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) -#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) -#endif /* STM32F415xx || STM32F417xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) -#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) -#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) -#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#if defined(STM32F407xx)|| defined(STM32F417xx) -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -#endif /* STM32F407xx || STM32F417xx */ - -#if defined(STM32F415xx) || defined(STM32F417xx) -#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) - -#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) -#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) -#endif /* STM32F415xx || STM32F417xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -/** - * @} - */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ -#if defined(STM32F401xC) || defined(STM32F401xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -/** - * @} - */ -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 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_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -/** - * @} - */ -#endif /* STM32F401xC || STM32F401xE*/ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F410xx -------------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) - -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB1) peripheral clock. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) - -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() -#define __HAL_RCC_AHB2_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) - -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) - -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -/** - * @} - */ - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/*----------------------------------------------------------------------------*/ - -/*-------------------------------- STM32F411xx -------------------------------*/ -#if defined(STM32F411xE) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @{ - */ -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -/** - * @} - */ -#endif /* STM32F411xE */ -/*----------------------------------------------------------------------------*/ - -/*---------------------------------- STM32F446xx -----------------------------*/ -#if defined(STM32F446xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) -#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) -#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) -#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) -#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CEC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) -#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) -#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) - -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) -#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) - -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) - -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) -#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) - -#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) -#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) - -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) -#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) -/** - * @} - */ - -#endif /* STM32F446xx */ -/*----------------------------------------------------------------------------*/ - -/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) -#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) -#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) -#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable - * @brief Enable or disable the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_RNG_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) - -#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ - __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0U) - -#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) -#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) - -#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ - UNUSED(tmpreg); \ - } while(0U) - -#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) -#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) -#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) - -#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) -#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable - * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DAC_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART7_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) -#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) -#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) -#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) -#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) -#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) -#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) -#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) -#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) -#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) -#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) -#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) -#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) -#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) -#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) -#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) -#endif /* STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) -#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) -#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) -#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) -#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) -#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) -#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) -#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) -#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) -#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) -#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) -#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) -#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) -#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) -#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) -#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) -#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) -#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) -#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) -#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) -#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) -#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) -#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) -#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) -#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) -#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) -#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) -#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) -#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) -#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable - * @brief Enable or disable the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_UART10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ - UNUSED(tmpreg); \ - } while(0U) -#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ - UNUSED(tmpreg); \ - } while(0U) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ - UNUSED(tmpreg); \ - } while(0U) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) -#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) -#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) -#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) -#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) -#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status - * @brief Get the enable or disable status of the APB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @{ - */ -#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) -#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) -#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) -#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) -#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) -#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) -#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) -#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) -#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) -#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) -#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset - * @brief Force or release AHB1 peripheral reset. - * @{ - */ -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) - -#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) -#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) -#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) -#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) -#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ -#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset - * @brief Force or release AHB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) - -#if defined(STM32F423xx) -#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) -#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) -#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) - -#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) -#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset - * @brief Force or release AHB3 peripheral reset. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) -#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) - -#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) - -#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) -#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F412Cx) -#define __HAL_RCC_AHB3_FORCE_RESET() -#define __HAL_RCC_AHB3_RELEASE_RESET() - -#define __HAL_RCC_FSMC_FORCE_RESET() -#define __HAL_RCC_QSPI_FORCE_RESET() - -#define __HAL_RCC_FSMC_RELEASE_RESET() -#define __HAL_RCC_QSPI_RELEASE_RESET() -#endif /* STM32F412Cx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset - * @brief Force or release APB1 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) -#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) -#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) -#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) -#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) -#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) -#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) -#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) -#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) -#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) -#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) -#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) -#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) -#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) -#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset - * @brief Force or release APB2 peripheral reset. - * @{ - */ -#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) -#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) -#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) -#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) -#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) -#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) -#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) -#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) -#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) -#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) -#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F423xx) -#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) -#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) -#endif /* STM32F423xx */ - -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) -#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) - -#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) -#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) -/** - * @} - */ - -/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable - * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) - -#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) -#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ - -/** - * @} - */ - -/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) -#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) -#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) -#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) -#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) -#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) -#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) -#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) -#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) -#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) -#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) -#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) -#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) -#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) -#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) -#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ - -/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable - * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @{ - */ -#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ - -#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) -#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) -#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) -#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) -#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) -#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) -#if defined(STM32F413xx) || defined(STM32F423xx) -#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) -#endif /* STM32F413xx || STM32F423xx */ -/** - * @} - */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------- PLL Configuration --------------------------*/ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz. - * - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ - STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ - (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ - ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) -#else -/** @brief Macro to configure the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * @param __RCC_PLLSource__ specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * @param __PLLM__ specifies the division factor for PLL VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432 - * Except for STM32F411xE devices where Min_Data = 192. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices - * where frequency is between 192 and 432 MHz. - * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - */ -#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ - (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ - ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ - ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ - ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) - #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -/*----------------------------------------------------------------------------*/ - -/*----------------------------PLLI2S Configuration ---------------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - -/** @brief Macros to enable or disable the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) -#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx */ -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLI2SP parameter is only available with STM32F446xx Devices - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @param __PLLI2SQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#else -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - */ -#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ - (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F411xE) -/** @brief Macro to configure the PLLI2S clock multiplication and division factors . - * @note This macro must be used only when the PLLI2S is disabled. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API). - * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices - * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLLI2S jitter. - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between Min_Data = 192 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ - ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ - ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. - * @note This macro must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * HAL_RCC_ClockConfig() API) - * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx - * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro - * @param __PLLI2SR__ specifies the division factor for I2S clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ - ((__PLLI2SQ__) << 24U) |\ - ((__PLLI2SR__) << 28U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------------ PLLSAI Configuration ------------------------*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macros to Enable or Disable the PLLISAI. - * @note The PLLSAI is only available with STM32F429x/439x Devices. - * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. - */ -#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) -#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) - -#if defined(STM32F446xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 63. - * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 1 MHz to limit PLLI2S jitter. - * @note The PLLSAIM parameter is only used with STM32F446xx Devices - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note the PLLSAIP parameter is only available with STM32F446xx Devices - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ - ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. - * This parameter must be a number in the range {2, 4, 6, or 8}. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ - ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** @brief Macro to configure the PLLSAI clock multiplication and division factors. - * - * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. - * This parameter must be a number between Min_Data = 50 and Max_Data = 432. - * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO - * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. - * - * @param __PLLSAIQ__ specifies the division factor for SAI clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 15. - * - * @param __PLLSAIR__ specifies the division factor for LTDC clock - * This parameter must be a number between Min_Data = 2 and Max_Data = 7. - * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices - */ -#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ - (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ - ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ - ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLL. - * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLR) / __PLLDivR__ - */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) -#endif /* STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. - * @note This function must be called before enabling the PLLI2S. - * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. - * This parameter must be a number between 1 and 32. - * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ - */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) - -/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . - * This parameter must be a number between Min_Data = 1 and Max_Data = 32. - * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. - * - * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling the PLLSAI. - * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . - * This parameter must be a number between Min_Data = 2 and Max_Data = 16. - * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ - */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/*----------------------------------------------------------------------------*/ - -/*------------------------- Peripheral Clock selection -----------------------*/ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) -/** @brief Macro to configure the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_CFGR_I2SSRC_BB = (__SOURCE__)) - - -/** @brief Macro to get the I2S clock source (I2SCLK). - * @retval The clock source can be one of the following values: - * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. - * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin - * used as I2S clock source - */ -#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block A clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to configure SAI1BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used - * as SAI1 Block B clock. - * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin - * used as SAI1 Block B clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) -/** @brief Macro to configure SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI1 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. - * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - */ -#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) - -/** @brief Macro to configure SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI2 clock source. - * This parameter can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) - -/** @brief Macro to Get SAI2 clock source selection. - * @note This configuration is only available with STM32F446xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. - * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. - */ -#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) - -/** @brief Macro to configure I2S APB1 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the CEC clock. - * @param __SOURCE__ specifies the CEC clock source. - * This parameter can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CEC clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock - * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock - */ -#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -/** @brief Macro to configure the SPDIFRX clock. - * @param __SOURCE__ specifies the SPDIFRX clock source. - * This parameter can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SPDIFRX clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. - * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. - */ -#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) - -/** @brief Macro to configure the DSI clock. - * @param __SOURCE__ specifies the DSI clock source. - * This parameter can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the DSI clock. - * @retval The clock source can be one of the following values: - * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. - * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. - */ -#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) - -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /** @brief Macro to configure the DFSDM1 clock. - * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. - * @retval None - */ -#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM1 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. - */ -#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM1 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ - STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) - -#if defined(STM32F413xx) || defined(STM32F423xx) - /** @brief Macro to configure the DFSDM2 clock. - * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. - * @retval None - */ -#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) - -/** @brief Macro to get the DFSDM2 clock source. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. - * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. - */ -#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) - -/** @brief Macro to configure DFSDM1 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @param __SOURCE__ specifies the DFSDM2 Audio clock source. - * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) - -/** @brief Macro to Get DFSDM2 Audio clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock - */ -#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) - -/** @brief Macro to configure SAI1BlockA clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block A clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockA clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) - -/** @brief Macro to configure SAI1 BlockB clock source selection. - * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. - * @note This function must be called before enabling PLLSAI, PLLI2S and - * the SAI clock. - * @param __SOURCE__ specifies the SAI Block B clock source. - * This parameter can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) - -/** @brief Macro to Get SAI1 BlockB clock source selection. - * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. - * @retval The clock source can be one of the following values: - * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. - * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F413xx || STM32F423xx */ - -/** @brief Macro to configure I2S APB1 clock source selection. - * @param __SOURCE__ specifies the I2S APB1 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB1 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) - -/** @brief Macro to configure I2S APB2 clock source selection. - * @param __SOURCE__ specifies the I2S APB2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) - -/** @brief Macro to Get I2S APB2 clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. - * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - */ -#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) - -/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). - * @note This macro must be called before enabling the I2S APB clock. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. - * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin - * used as I2S clock source. - */ -#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the CLK48 clock. - * @param __SOURCE__ specifies the CLK48 clock source. - * This parameter can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. - */ -#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the CLK48 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. - * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock - */ -#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) - -/** @brief Macro to configure the SDIO clock. - * @param __SOURCE__ specifies the SDIO clock source. - * This parameter can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the SDIO clock. - * @retval The clock source can be one of the following values: - * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. - * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. - */ -#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) - -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macro to configure I2S clock source selection. - * @param __SOURCE__ specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) - -/** @brief Macro to Get I2S clock source selection. - * @retval The clock source can be one of the following values: - * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. - * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. - * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. - */ -#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) - -/** @brief Macro to configure the FMPI2C1 clock. - * @param __SOURCE__ specifies the FMPI2C1 clock source. - * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the FMPI2C1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock - * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock - */ -#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) - -/** @brief Macro to configure the LPTIM1 clock. - * @param __SOURCE__ specifies the LPTIM1 clock source. - * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) - -/** @brief Macro to Get the LPTIM1 clock. - * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock - * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock - */ -#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** @brief Macro to configure the Timers clocks prescalers - * @note This feature is only available with STM32F429x/439x Devices. - * @param __PRESC__ specifies the Timers clocks prescalers selection - * This parameter can be one of the following values: - * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1 or 2, - * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to - * division by 4 or more. - * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is - * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, - * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding - * to division by 8 or more. - */ -#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ - STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ - STM32F423xx */ - -/*----------------------------------------------------------------------------*/ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** @brief Enable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Disable PLLSAI_RDY interrupt. - */ -#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) - -/** @brief Clear the PLLSAI RDY interrupt pending bits. - */ -#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) - -/** @brief Check the PLLSAI RDY interrupt has occurred or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) - -/** @brief Check PLLSAI RDY flag is set or not. - * @retval The new state (TRUE or FALSE). - */ -#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** @brief Macros to enable or disable the RCC MCO1 feature. - */ -#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) -#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) - -/** @brief Macros to enable or disable the RCC MCO2 feature. - */ -#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) -#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) - -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup RCCEx_Exported_Functions - * @{ - */ - -/** @addtogroup RCCEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); - -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -void HAL_RCCEx_SelectLSEMode(uint8_t Mode); -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(RCC_PLLI2S_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); -#endif /* RCC_PLLI2S_SUPPORT */ -#if defined(RCC_PLLSAI_SUPPORT) -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); -#endif /* RCC_PLLSAI_SUPPORT */ -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Constants RCCEx Private Constants - * @{ - */ - -/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion - * @brief RCC registers bit address in the alias region - * @{ - */ -/* --- CR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1CU -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) - -#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1AU -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- DCKCFGR Register ---*/ -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ - defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) -#define RCC_TIMPRE_BIT_NUMBER 0x18U -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ - STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ - STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/* --- CFGR Register ---*/ -#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) -/* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17U -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) -/* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) - -#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8U -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) - -/* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9U -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup RCCEx_Private_Macros RCCEx Private Macros - * @{ - */ -/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters - * @{ - */ -#if defined(STM32F411xE) -#define IS_RCC_PLLN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) -#else /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || - STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410Tx || STM32F410Cx || - STM32F410Rx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Cx || STM32F412Rx || - STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ -#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) -#endif /* STM32F411xE */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) -#endif /* STM32F413xx || STM32F423xx */ - -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) - -#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ - ((VALUE) == RCC_PLLSAIDIVR_4) ||\ - ((VALUE) == RCC_PLLSAIDIVR_8) ||\ - ((VALUE) == RCC_PLLSAIDIVR_16)) -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F446xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ - ((VALUE) == RCC_PLLI2SP_DIV4) ||\ - ((VALUE) == RCC_PLLI2SP_DIV6) ||\ - ((VALUE) == RCC_PLLI2SP_DIV8)) - -#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) - -#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - - #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_CECCLKSOURCE_LSE)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ - ((VALUE) == RCC_PLLSAIP_DIV4) ||\ - ((VALUE) == RCC_PLLSAIP_DIV6) ||\ - ((VALUE) == RCC_PLLSAIP_DIV8)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) - -#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ - ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) - -#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) - -#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ - ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) - -#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) - - #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) - -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ - ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) - -#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ - ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) - -#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ - ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) - -#if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ - ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) - -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) - -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ - ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) - -#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) - -#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ - ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) - -#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) - -#endif /* STM32F413xx || STM32F423xx */ -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) - -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) - -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ - ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_RCC_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_EX_H +#define __STM32F4xx_HAL_RCC_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ + + uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + except for STM32F411xE devices where the Min_Data = 192 */ + + uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). + This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ + + uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx + and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +}RCC_PLLInitTypeDef; + +#if defined(STM32F446xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. + This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIM; /*!< Spcifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ + + uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. + This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F446xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLL is selected as Clock Source SAI */ + + uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ + + uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ + + uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ + + uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. + This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. + This parameter is only available in STM32F469xx/STM32F479xx devices. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ +#endif /* STM32F469xx || STM32F479xx */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ + + uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ + +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. + This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ +#endif /* STM32F469xx || STM32F479xx */ +}RCC_PeriphCLKInitTypeDef; + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ +#if defined(STM32F411xE) + uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ +#endif /* STM32F411xE */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + Except for STM32F411xE devices where the Min_Data = 192. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants + * @{ + */ + +/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection + * @{ + */ +/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_TIM 0x00000004U +#define RCC_PERIPHCLK_RTC 0x00000008U +#define RCC_PERIPHCLK_FMPI2C1 0x00000010U +#define RCC_PERIPHCLK_CLK48 0x00000020U +#define RCC_PERIPHCLK_SDIO 0x00000040U +#define RCC_PERIPHCLK_PLLI2S 0x00000080U +#define RCC_PERIPHCLK_DFSDM1 0x00000100U +#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U +#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_DFSDM2 0x00000400U +#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U +#define RCC_PERIPHCLK_LPTIM1 0x00001000U +#define RCC_PERIPHCLK_SAIA 0x00002000U +#define RCC_PERIPHCLK_SAIB 0x00004000U +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_TIM 0x00000002U +#define RCC_PERIPHCLK_RTC 0x00000004U +#define RCC_PERIPHCLK_FMPI2C1 0x00000008U +#define RCC_PERIPHCLK_LPTIM1 0x00000010U +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_SAI1 0x00000004U +#define RCC_PERIPHCLK_SAI2 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_CEC 0x00000040U +#define RCC_PERIPHCLK_FMPI2C1 0x00000080U +#define RCC_PERIPHCLK_CLK48 0x00000100U +#define RCC_PERIPHCLK_SDIO 0x00000200U +#define RCC_PERIPHCLK_SPDIFRX 0x00000400U +#define RCC_PERIPHCLK_PLLI2S 0x00000800U +#endif /* STM32F446xx */ +/*-----------------------------------------------------------------------------*/ + +/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#define RCC_PERIPHCLK_CLK48 0x00000080U +#define RCC_PERIPHCLK_SDIO 0x00000100U +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_RTC 0x00000002U +#define RCC_PERIPHCLK_PLLI2S 0x00000004U +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_TIM 0x00000008U +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SCLKSOURCE_EXT 0x00000001U +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ + +/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIDIVR_2 0x00000000U +#define RCC_PLLSAIDIVR_4 0x00010000U +#define RCC_PLLSAIDIVR_8 0x00020000U +#define RCC_PLLSAIDIVR_16 0x00030000U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define RCC_PLLI2SP_DIV2 0x00000002U +#define RCC_PLLI2SP_DIV4 0x00000004U +#define RCC_PLLI2SP_DIV6 0x00000006U +#define RCC_PLLI2SP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIP_DIV2 0x00000002U +#define RCC_PLLSAIP_DIV4 0x00000004U +#define RCC_PLLSAIP_DIV6 0x00000006U +#define RCC_PLLSAIP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U +#define RCC_SAIACLKSOURCE_EXT 0x00200000U +/** + * @} + */ + +/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U +#define RCC_SAIBCLKSOURCE_EXT 0x00800000U +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source + * @{ + */ +#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U +#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) +/** + * @} + */ +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source + * @{ + */ +#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) +#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) +#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source + * @{ + */ +#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) +#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) +#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source + * @{ + */ +#define RCC_CECCLKSOURCE_HSI 0x00000000U +#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source + * @{ + */ +#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U +#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) +/** + * @} + */ + +#endif /* STM32F446xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) +#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) +#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) +#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) +#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ + + +/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source + * @{ + */ +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source + * @{ + */ +#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U +#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source + * @{ + */ +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + +/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source + * @{ + */ +#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U +#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) +#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection + * @{ + */ +#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) +#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection + * @{ + */ +#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) +#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros + * @{ + */ +/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) +#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) +#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) + +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) +#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) +#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) +#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) +#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ + #define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) + +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) +#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) +#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) +#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) +#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) +#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) + +#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) +#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) + +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) + +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) + /** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F415xx || STM32F417xx */ + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +/** + * @} + */ +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 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_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +/** + * @} + */ +#endif /* STM32F401xC || STM32F401xE*/ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F410xx -------------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) + +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB1) peripheral clock. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) + +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() +#define __HAL_RCC_AHB2_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) + +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) + +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +/** + * @} + */ + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F411xx -------------------------------*/ +#if defined(STM32F411xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +/** + * @} + */ +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F446xx -----------------------------*/ +#if defined(STM32F446xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CEC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) +/** + * @} + */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) +#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +#endif /* STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx | STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) +#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) +#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) +#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#if defined(STM32F423xx) +#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) +#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Cx) +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() + +#define __HAL_RCC_FSMC_FORCE_RESET() +#define __HAL_RCC_QSPI_FORCE_RESET() + +#define __HAL_RCC_FSMC_RELEASE_RESET() +#define __HAL_RCC_QSPI_RELEASE_RESET() +#endif /* STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) +#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------- PLL Configuration --------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz. + * + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ + STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ + (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ + ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) +#else +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432 + * Except for STM32F411xE devices where Min_Data = 192. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices + * where frequency is between 192 and 432 MHz. + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ + (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) + #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------PLLI2S Configuration ---------------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/** @brief Macros to enable or disable the PLLI2S. + * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) +#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx */ +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLI2SP parameter is only available with STM32F446xx Devices + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#else +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F411xE) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLLI2S jitter. + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 192 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API) + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx + * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ + ((__PLLI2SQ__) << 24U) |\ + ((__PLLI2SR__) << 28U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------ PLLSAI Configuration ------------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to Enable or Disable the PLLISAI. + * @note The PLLSAI is only available with STM32F429x/439x Devices. + * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) +#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) + +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * @note The PLLSAIM parameter is only used with STM32F446xx Devices + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLSAIP parameter is only available with STM32F446xx Devices + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ + ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLL. + * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLR) / __PLLDivR__ + */ +#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . + * This parameter must be a number between Min_Data = 1 and Max_Data = 32. + * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. + * + * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . + * This parameter must be a number between Min_Data = 2 and Max_Data = 16. + * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- Peripheral Clock selection -----------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ + defined(STM32F479xx) +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_CFGR_I2SSRC_BB = (__SOURCE__)) + + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin + * used as I2S clock source + */ +#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block A clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to configure SAI1BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block B clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @brief Macro to configure SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI1 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) + +/** @brief Macro to configure SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI2 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) + +/** @brief Macro to configure I2S APB1 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the CEC clock. + * @param __SOURCE__ specifies the CEC clock source. + * This parameter can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CEC clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +/** @brief Macro to configure the SPDIFRX clock. + * @param __SOURCE__ specifies the SPDIFRX clock source. + * This parameter can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SPDIFRX clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) + +/** @brief Macro to configure the DSI clock. + * @param __SOURCE__ specifies the DSI clock source. + * This parameter can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the DSI clock. + * @retval The clock source can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) + +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + /** @brief Macro to configure the DFSDM1 clock. + * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. + * @retval None + */ +#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM1 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. + */ +#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM1 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) + +#if defined(STM32F413xx) || defined(STM32F423xx) + /** @brief Macro to configure the DFSDM2 clock. + * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. + * @retval None + */ +#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM2 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. + */ +#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM2 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM2 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockA clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) + +/** @brief Macro to configure SAI1 BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockB clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F413xx || STM32F423xx */ + +/** @brief Macro to configure I2S APB1 clock source selection. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @param __SOURCE__ specifies the I2S APB2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). + * @note This macro must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macro to configure I2S clock source selection. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) + +/** @brief Macro to Get I2S clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the Timers clocks prescalers + * @note This feature is only available with STM32F429x/439x Devices. + * @param __PRESC__ specifies the Timers clocks prescalers selection + * This parameter can be one of the following values: + * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1 or 2, + * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to + * division by 4 or more. + * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, + * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding + * to division by 8 or more. + */ +#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ + STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ + STM32F423xx */ + +/*----------------------------------------------------------------------------*/ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Enable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Disable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) + +/** @brief Clear the PLLSAI RDY interrupt pending bits. + */ +#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) + +/** @brief Check the PLLSAI RDY interrupt has occurred or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Check PLLSAI RDY flag is set or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macros to enable or disable the RCC MCO1 feature. + */ +#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) +#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) + +/** @brief Macros to enable or disable the RCC MCO2 feature. + */ +#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) +#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCCEx_Exported_Functions + * @{ + */ + +/** @addtogroup RCCEx_Exported_Functions_Group1 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); + +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +void HAL_RCCEx_SelectLSEMode(uint8_t Mode); +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +#if defined(RCC_PLLI2S_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ + +/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +/* --- CR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of PLLSAION bit */ +#define RCC_PLLSAION_BIT_NUMBER 0x1CU +#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) + +#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of PLLI2SON bit */ +#define RCC_PLLI2SON_BIT_NUMBER 0x1AU +#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- DCKCFGR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of TIMPRE bit */ +#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) +#define RCC_TIMPRE_BIT_NUMBER 0x18U +#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ + STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- CFGR Register ---*/ +#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of I2SSRC bit */ +#define RCC_I2SSRC_BIT_NUMBER 0x17U +#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/* --- PLLI2SCFGR Register ---*/ +#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) +/* Alias word address of PLLI2SSRC bit */ +#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U +#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/* Alias word address of MCO1EN bit */ +#define RCC_MCO1EN_BIT_NUMBER 0x8U +#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) + +/* Alias word address of MCO2EN bit */ +#define RCC_MCO2EN_BIT_NUMBER 0x9U +#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#if defined(STM32F411xE) +#define IS_RCC_PLLN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((192U <= (VALUE)) && ((VALUE) <= 432U)) +#else /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || + STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410Tx || STM32F410Cx || + STM32F410Rx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Cx || STM32F412Rx || + STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) +#endif /* STM32F413xx || STM32F423xx */ + +#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ + ((VALUE) == RCC_PLLSAIDIVR_4) ||\ + ((VALUE) == RCC_PLLSAIDIVR_8) ||\ + ((VALUE) == RCC_PLLSAIDIVR_16)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ + ((VALUE) == RCC_PLLI2SP_DIV4) ||\ + ((VALUE) == RCC_PLLI2SP_DIV6) ||\ + ((VALUE) == RCC_PLLI2SP_DIV8)) + +#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) + +#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_CECCLKSOURCE_LSE)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ + ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) + +#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) + +#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#endif /* STM32F413xx || STM32F423xx */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) + +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h index 07cb4702..d6f1a1a6 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -1,2030 +1,2030 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.h - * @author MCD Application Team - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_H -#define STM32F4xx_HAL_TIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - GP timers: this parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - Advanced timers: this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. - This parameter can be a value of @ref TIM_AutoReloadPreload */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for timer instances supporting break feature. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - -/** - * @brief TIM Input Capture Configuration Structure definition - */ -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClockConfigTypeDef; - -/** - * @brief TIM Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler - This parameter must be 0: When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct -{ - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode - @note When the Master/slave mode is enabled, the effect of - an event on the trigger input (TRGI) is delayed to allow a - perfect synchronization between the current timer and its - slaves (through TRGO). It is not mandatory in case of timer - synchronization mode. */ -} TIM_MasterConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct -{ - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -} TIM_SlaveConfigTypeDef; - -/** - * @brief TIM Break input(s) and Dead time configuration Structure definition - * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable - * filter and polarity. - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode - This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode - This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - uint32_t LockLevel; /*!< TIM Lock level - This parameter can be a value of @ref TIM_Lock_level */ - uint32_t DeadTime; /*!< TIM dead Time - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint32_t BreakState; /*!< TIM Break State - This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - uint32_t BreakPolarity; /*!< TIM Break input polarity - This parameter can be a value of @ref TIM_Break_Polarity */ - uint32_t BreakFilter; /*!< Specifies the break input filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -} TIM_BreakDeadTimeConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ -} HAL_TIM_StateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ -} HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -typedef struct __TIM_HandleTypeDef -#else -typedef struct -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ - void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ - void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ - void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ - void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ - void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ - void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ - void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ - void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ - void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ - void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ - void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ - void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ - void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ - void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ - void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ - void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ - void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ - void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ - void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ - void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ - void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ - void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ - void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ - void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ - void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ - void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} TIM_HandleTypeDef; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief HAL TIM Callback ID enumeration definition - */ -typedef enum -{ - HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ - ,HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ - ,HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ - ,HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ - ,HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ - ,HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ - ,HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ - ,HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ - ,HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ - ,HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ - ,HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ - ,HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ - ,HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ - ,HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ - ,HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ - ,HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ - ,HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ - ,HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ - - ,HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ - ,HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ - ,HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ - ,HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ - ,HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ - ,HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ - ,HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ - ,HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ - ,HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ -} HAL_TIM_CallbackIDTypeDef; - -/** - * @brief HAL TIM Callback pointer definition - */ -typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ - -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ -#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base Address - * @{ - */ -#define TIM_DMABASE_CR1 0x00000000U -#define TIM_DMABASE_CR2 0x00000001U -#define TIM_DMABASE_SMCR 0x00000002U -#define TIM_DMABASE_DIER 0x00000003U -#define TIM_DMABASE_SR 0x00000004U -#define TIM_DMABASE_EGR 0x00000005U -#define TIM_DMABASE_CCMR1 0x00000006U -#define TIM_DMABASE_CCMR2 0x00000007U -#define TIM_DMABASE_CCER 0x00000008U -#define TIM_DMABASE_CNT 0x00000009U -#define TIM_DMABASE_PSC 0x0000000AU -#define TIM_DMABASE_ARR 0x0000000BU -#define TIM_DMABASE_RCR 0x0000000CU -#define TIM_DMABASE_CCR1 0x0000000DU -#define TIM_DMABASE_CCR2 0x0000000EU -#define TIM_DMABASE_CCR3 0x0000000FU -#define TIM_DMABASE_CCR4 0x00000010U -#define TIM_DMABASE_BDTR 0x00000011U -#define TIM_DMABASE_DCR 0x00000012U -#define TIM_DMABASE_DMAR 0x00000013U -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ -/** - * @} - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ -#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ -#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State TIM Output Compare State - * @{ - */ -#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ -#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ -/** - * @} - */ - -/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload - * @{ - */ -#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ -#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ -#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State - * @{ - */ -#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ -#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ -#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ -#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ -#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ -#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity - * @{ - */ -#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ -#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ -#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ -#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM interrupt Definition - * @{ - */ -#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ -#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ -#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ -#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ -#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ -#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ -#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ -#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ -#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA Sources - * @{ - */ -#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ -#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ -#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ -#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ -#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ -#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ -#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag Definition - * @{ - */ -#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ -#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ -#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ -#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ -#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ -#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ -#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ -#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ -#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ -#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ -#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ -#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ -#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ -#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ -#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ -#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ -#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ -#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ -#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ -#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ -#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ -#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ -#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ -#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ -#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ -#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ -/** - * @} - */ -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ -#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ -#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ -#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable - * @{ - */ -#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ -#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Input Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ -#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable - * @{ - */ -#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ -#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event - (if none of the break inputs BRK and BRK2 is active) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ -#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ -#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ -#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ -#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ -#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ -#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ -#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ -#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ -#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ -#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes - * @{ - */ -#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ -#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ -#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ -#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ -#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ -#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ -#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ -#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ -#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ -#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ -#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ -#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ -#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ -/** - * @} - */ - -/** @defgroup DMA_Handle_index TIM DMA Handle Index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State TIM Capture/Compare Channel State - * @{ - */ -#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ -#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ -#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ -#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ - -/** @brief Reset TIM handle state. - * @param __HANDLE__ TIM handle. - * @retval None - */ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ - (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ - (__HANDLE__)->Base_MspInitCallback = NULL; \ - (__HANDLE__)->Base_MspDeInitCallback = NULL; \ - (__HANDLE__)->IC_MspInitCallback = NULL; \ - (__HANDLE__)->IC_MspDeInitCallback = NULL; \ - (__HANDLE__)->OC_MspInitCallback = NULL; \ - (__HANDLE__)->OC_MspDeInitCallback = NULL; \ - (__HANDLE__)->PWM_MspInitCallback = NULL; \ - (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ - (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspInitCallback = NULL; \ - (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ - (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ - } while(0) -#else -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET) -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__ TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__ TIM handle - * @retval None - * @note The Main Output Enable of a timer instance is disabled unconditionally - */ -#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) - -/** @brief Enable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to enable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) - -/** @brief Disable the specified TIM interrupt. - * @param __HANDLE__ specifies the TIM Handle. - * @param __INTERRUPT__ specifies the TIM interrupt source to disable. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) - -/** @brief Enable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to enable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) - -/** @brief Disable the specified DMA request. - * @param __HANDLE__ specifies the TIM Handle. - * @param __DMA__ specifies the TIM DMA request to disable. - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: Update DMA request - * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request - * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request - * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request - * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request - * @arg TIM_DMA_COM: Commutation DMA request - * @arg TIM_DMA_TRIGGER: Trigger DMA request - * @retval None - */ -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) - -/** @brief Check whether the specified TIM interrupt flag is set or not. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) - -/** @brief Clear the specified TIM interrupt flag. - * @param __HANDLE__ specifies the TIM Handle. - * @param __FLAG__ specifies the TIM interrupt flag to clear. - * This parameter can be one of the following values: - * @arg TIM_FLAG_UPDATE: Update interrupt flag - * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag - * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag - * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag - * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag - * @arg TIM_FLAG_COM: Commutation interrupt flag - * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag - * @arg TIM_FLAG_BREAK: Break interrupt flag - * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag - * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag - * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag - * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** - * @brief Check whether the specified TIM interrupt source is enabled or not. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval The state of TIM_IT (SET or RESET). - */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ - == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Clear the TIM interrupt pending bits. - * @param __HANDLE__ TIM handle - * @param __INTERRUPT__ specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg TIM_IT_UPDATE: Update interrupt - * @arg TIM_IT_CC1: Capture/Compare 1 interrupt - * @arg TIM_IT_CC2: Capture/Compare 2 interrupt - * @arg TIM_IT_CC3: Capture/Compare 3 interrupt - * @arg TIM_IT_CC4: Capture/Compare 4 interrupt - * @arg TIM_IT_COM: Commutation interrupt - * @arg TIM_IT_TRIGGER: Trigger interrupt - * @arg TIM_IT_BREAK: Break interrupt - * @retval None - */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -/** - * @brief Indicates whether or not the TIM Counter is used as downcounter. - * @param __HANDLE__ TIM handle. - * @retval False (Counter used as upcounter) or True (Counter used as downcounter) - * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder -mode. - */ -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) - -/** - * @brief Set the TIM Prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __PRESC__ specifies the Prescaler new value. - * @retval None - */ -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -/** - * @brief Set the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __COUNTER__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Get the TIM Counter Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __AUTORELOAD__ specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) - -/** - * @brief Get the TIM Autoreload Register value on runtime. - * @param __HANDLE__ TIM handle. - * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. - * @param __HANDLE__ TIM handle. - * @param __CKD__ specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) - -/** - * @brief Get the TIM Clock Division value on runtime. - * @param __HANDLE__ TIM handle. - * @retval The clock division can be one of the following values: - * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT - * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT - * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__ specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Get the TIM Input Capture prescaler on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval The input capture prescaler can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) - -/** - * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__ specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) - -/** - * @brief Get the TIM Capture Compare Register value on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__HANDLE__)->Instance->CCR4)) - -/** - * @brief Set the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) - -/** - * @brief Reset the TIM Output compare preload. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) - -/** - * @brief Enable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is enabled an active edge on the trigger input acts - * like a compare match on CCx output. Delay to sample the trigger - * input and to activate CCx output is reduced to 3 clock cycles. - * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. - * @retval None - */ -#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) - -/** - * @brief Disable fast mode for a given channel. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @note When fast mode is disabled CCx output behaves normally depending - * on counter and CCRx values even when the trigger is ON. The minimum - * delay to activate CCx output when an active edge occurs on the - * trigger input is 5 clock cycles. - * @retval None - */ -#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. - * @param __HANDLE__ TIM handle. - * @note When the URS bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) - -/** - * @brief Set the TIM Capture x input polarity on runtime. - * @param __HANDLE__ TIM handle. - * @param __CHANNEL__ TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__ Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) - -/** - * @} - */ -/* End of exported macros ----------------------------------------------------*/ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Constants TIM Private Constants - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ -/* End of private constants --------------------------------------------------*/ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR)) - -#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ - ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ - ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ - ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) - -#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ - ((__STATE__) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ - ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ - ((__STATE__) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) - -#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ - ((__SELECTION__) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ - ((__PRESCALER__) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ - ((__MODE__) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ - ((__MODE__) == TIM_ENCODERMODE_TI2) || \ - ((__MODE__) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) - -#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3) || \ - ((__CHANNEL__) == TIM_CHANNEL_4) || \ - ((__CHANNEL__) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ - ((__CHANNEL__) == TIM_CHANNEL_2) || \ - ((__CHANNEL__) == TIM_CHANNEL_3)) - -#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ - ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1)) - -#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ - ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ - ((__STATE__) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ - ((__STATE__) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ - ((__LEVEL__) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) - - -#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ - ((__STATE__) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ - ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ - ((__SOURCE__) == TIM_TRGO_ENABLE) || \ - ((__SOURCE__) == TIM_TRGO_UPDATE) || \ - ((__SOURCE__) == TIM_TRGO_OC1) || \ - ((__SOURCE__) == TIM_TRGO_OC1REF) || \ - ((__SOURCE__) == TIM_TRGO_OC2REF) || \ - ((__SOURCE__) == TIM_TRGO_OC3REF) || \ - ((__SOURCE__) == TIM_TRGO_OC4REF)) - -#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ - ((__MODE__) == TIM_SLAVEMODE_RESET) || \ - ((__MODE__) == TIM_SLAVEMODE_GATED) || \ - ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ - ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ - ((__MODE__) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ - ((__MODE__) == TIM_OCMODE_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_INACTIVE) || \ - ((__MODE__) == TIM_OCMODE_TOGGLE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_TI1F_ED) || \ - ((__SELECTION__) == TIM_TS_TI1FP1) || \ - ((__SELECTION__) == TIM_TS_TI2FP2) || \ - ((__SELECTION__) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ - ((__SELECTION__) == TIM_TS_ITR1) || \ - ((__SELECTION__) == TIM_TS_ITR2) || \ - ((__SELECTION__) == TIM_TS_ITR3) || \ - ((__SELECTION__) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ - ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) - -#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) - -#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) - -/** - * @} - */ -/* End of private macros -----------------------------------------------------*/ - -/* Include TIM HAL Extended module */ -#include "stm32f4xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * @{ - */ -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * @{ - */ -/* Timer Output Compare functions *********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * @{ - */ -/* Timer PWM functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * @{ - */ -/* Timer Input Capture functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * @{ - */ -/* Timer One Pulse functions **************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * @{ - */ -/* Timer Encoder functions ****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * @{ - */ -/* Interrupt Handler functions ***********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/* Callbacks Register/UnRegister functions ***********************************/ -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback); -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief Peripheral State functions - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -void TIM_ResetCallback(TIM_HandleTypeDef *htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32F4xx_HAL_TIM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.h + * @author MCD Application Team + * @brief Header file of TIM HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_H +#define STM32F4xx_HAL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIM_Exported_Types TIM Exported Types + * @{ + */ + +/** + * @brief TIM Time base Configuration Structure definition + */ +typedef struct +{ + uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint32_t Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_ClockDivision */ + + uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + GP timers: this parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + Advanced timers: this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. + This parameter can be a value of @ref TIM_AutoReloadPreload */ +} TIM_Base_InitTypeDef; + +/** + * @brief TIM Output Compare Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCFastMode; /*!< Specifies the Fast mode state. + This parameter can be a value of @ref TIM_Output_Fast_State + @note This parameter is valid only in PWM1 and PWM2 mode. */ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ +} TIM_OC_InitTypeDef; + +/** + * @brief TIM One Pulse Mode Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_OnePulse_InitTypeDef; + +/** + * @brief TIM Input Capture Configuration Structure definition + */ +typedef struct +{ + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_IC_InitTypeDef; + +/** + * @brief TIM Encoder Configuration Structure definition + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Mode */ + + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC1Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC2Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC2Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_Encoder_InitTypeDef; + +/** + * @brief Clock Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< TIM clock sources + This parameter can be a value of @ref TIM_Clock_Source */ + uint32_t ClockPolarity; /*!< TIM clock polarity + This parameter can be a value of @ref TIM_Clock_Polarity */ + uint32_t ClockPrescaler; /*!< TIM clock prescaler + This parameter can be a value of @ref TIM_Clock_Prescaler */ + uint32_t ClockFilter; /*!< TIM clock filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClockConfigTypeDef; + +/** + * @brief TIM Clear Input Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClearInputState; /*!< TIM clear Input state + This parameter can be ENABLE or DISABLE */ + uint32_t ClearInputSource; /*!< TIM clear Input sources + This parameter can be a value of @ref TIM_ClearInput_Source */ + uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity + This parameter can be a value of @ref TIM_ClearInput_Polarity */ + uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler + This parameter must be 0: When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + uint32_t ClearInputFilter; /*!< TIM Clear Input filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClearInputConfigTypeDef; + +/** + * @brief TIM Master configuration Structure definition + */ +typedef struct +{ + uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection */ + uint32_t MasterSlaveMode; /*!< Master/slave mode selection + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ +} TIM_MasterConfigTypeDef; + +/** + * @brief TIM Slave configuration Structure definition + */ +typedef struct +{ + uint32_t SlaveMode; /*!< Slave mode selection + This parameter can be a value of @ref TIM_Slave_Mode */ + uint32_t InputTrigger; /*!< Input Trigger source + This parameter can be a value of @ref TIM_Trigger_Selection */ + uint32_t TriggerPolarity; /*!< Input Trigger polarity + This parameter can be a value of @ref TIM_Trigger_Polarity */ + uint32_t TriggerPrescaler; /*!< Input trigger prescaler + This parameter can be a value of @ref TIM_Trigger_Prescaler */ + uint32_t TriggerFilter; /*!< Input trigger filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + +} TIM_SlaveConfigTypeDef; + +/** + * @brief TIM Break input(s) and Dead time configuration Structure definition + * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable + * filter and polarity. + */ +typedef struct +{ + uint32_t OffStateRunMode; /*!< TIM off state in run mode + This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ + uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode + This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ + uint32_t LockLevel; /*!< TIM Lock level + This parameter can be a value of @ref TIM_Lock_level */ + uint32_t DeadTime; /*!< TIM dead Time + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint32_t BreakState; /*!< TIM Break State + This parameter can be a value of @ref TIM_Break_Input_enable_disable */ + uint32_t BreakPolarity; /*!< TIM Break input polarity + This parameter can be a value of @ref TIM_Break_Polarity */ + uint32_t BreakFilter; /*!< Specifies the break input filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BreakDeadTimeConfigTypeDef; + +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ + HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ + HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ +} HAL_TIM_StateTypeDef; + +/** + * @brief HAL Active channel structures definition + */ +typedef enum +{ + HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ + HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ + HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ + HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ + HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ +} HAL_TIM_ActiveChannel; + +/** + * @brief TIM Time Base Handle Structure definition + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +typedef struct __TIM_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +{ + TIM_TypeDef *Instance; /*!< Register base address */ + TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ + HAL_TIM_ActiveChannel Channel; /*!< Active channel */ + DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array + This array is accessed by a @ref DMA_Handle_index */ + HAL_LockTypeDef Lock; /*!< Locking object */ + __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ + void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ + void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ + void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ + void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ + void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ + void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ + void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ + void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ + void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ + void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ + void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ + void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ + void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ + void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ + void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ + void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ + void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ + void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ + void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ + void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ + void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ + void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ + void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ + void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ + void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ + void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} TIM_HandleTypeDef; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief HAL TIM Callback ID enumeration definition + */ +typedef enum +{ + HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ + ,HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ + ,HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ + ,HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ + ,HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ + ,HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ + ,HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ + ,HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ + ,HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ + ,HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ + ,HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ + ,HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ + ,HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ + ,HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ + ,HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ + ,HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ + ,HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ + ,HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ + + ,HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ + ,HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ + ,HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ + ,HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ + ,HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ + ,HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ + ,HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ + ,HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ + ,HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ +} HAL_TIM_CallbackIDTypeDef; + +/** + * @brief HAL TIM Callback pointer definition + */ +typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ + +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_ClearInput_Source TIM Clear Input Source + * @{ + */ +#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ +#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address TIM DMA Base Address + * @{ + */ +#define TIM_DMABASE_CR1 0x00000000U +#define TIM_DMABASE_CR2 0x00000001U +#define TIM_DMABASE_SMCR 0x00000002U +#define TIM_DMABASE_DIER 0x00000003U +#define TIM_DMABASE_SR 0x00000004U +#define TIM_DMABASE_EGR 0x00000005U +#define TIM_DMABASE_CCMR1 0x00000006U +#define TIM_DMABASE_CCMR2 0x00000007U +#define TIM_DMABASE_CCER 0x00000008U +#define TIM_DMABASE_CNT 0x00000009U +#define TIM_DMABASE_PSC 0x0000000AU +#define TIM_DMABASE_ARR 0x0000000BU +#define TIM_DMABASE_RCR 0x0000000CU +#define TIM_DMABASE_CCR1 0x0000000DU +#define TIM_DMABASE_CCR2 0x0000000EU +#define TIM_DMABASE_CCR3 0x0000000FU +#define TIM_DMABASE_CCR4 0x00000010U +#define TIM_DMABASE_BDTR 0x00000011U +#define TIM_DMABASE_DCR 0x00000012U +#define TIM_DMABASE_DMAR 0x00000013U +/** + * @} + */ + +/** @defgroup TIM_Event_Source TIM Event Source + * @{ + */ +#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ +#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ +#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ +#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ +#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ +#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ +#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ +#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ +/** + * @} + */ + +/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity + * @{ + */ +#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Polarity TIM ETR Polarity + * @{ + */ +#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ +#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler + * @{ + */ +#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ +#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ +#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ +#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode TIM Counter Mode + * @{ + */ +#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ +#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ +#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ +#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ +#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ +/** + * @} + */ + +/** @defgroup TIM_ClockDivision TIM Clock Division + * @{ + */ +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_State TIM Output Compare State + * @{ + */ +#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ +#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ +/** + * @} + */ + +/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload + * @{ + */ +#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ +#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ + +/** + * @} + */ + +/** @defgroup TIM_Output_Fast_State TIM Output Fast State + * @{ + */ +#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ +#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State + * @{ + */ +#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ +#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity + * @{ + */ +#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ +#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity + * @{ + */ +#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ +#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State + * @{ + */ +#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ +#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State + * @{ + */ +#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ +#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity + * @{ + */ +#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ +#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ +#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection + * @{ + */ +#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively */ +#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler + * @{ + */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ +#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ +#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode + * @{ + */ +#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode TIM Encoder Mode + * @{ + */ +#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ +#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ +#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ +/** + * @} + */ + +/** @defgroup TIM_Interrupt_definition TIM interrupt Definition + * @{ + */ +#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ +#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ +#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ +#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ +#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ +#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ +#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ +#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ +/** + * @} + */ + +/** @defgroup TIM_Commutation_Source TIM Commutation Source + * @{ + */ +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ +/** + * @} + */ + +/** @defgroup TIM_DMA_sources TIM DMA Sources + * @{ + */ +#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ +#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ +#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ +#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ +#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ +#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ +#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ +/** + * @} + */ + +/** @defgroup TIM_Flag_definition TIM Flag Definition + * @{ + */ +#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ +#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ +#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ +#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ +#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ +#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ +#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ +#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ +#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ +#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ +#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ +#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ +/** + * @} + */ + +/** @defgroup TIM_Channel TIM Channel + * @{ + */ +#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ +#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ +#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ +#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ +#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Source TIM Clock Source + * @{ + */ +#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ +#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ +#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ +#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ +#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ +#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ +#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ +#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ +#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ +#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Polarity TIM Clock Polarity + * @{ + */ +#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler + * @{ + */ +#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ +#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ +#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity + * @{ + */ +#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ +#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler + * @{ + */ +#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state + * @{ + */ +#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ + +/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state + * @{ + */ +#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ +/** @defgroup TIM_Lock_level TIM Lock level + * @{ + */ +#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ +#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable + * @{ + */ +#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ +#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ +/** + * @} + */ + +/** @defgroup TIM_Break_Polarity TIM Break Input Polarity + * @{ + */ +#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ +#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable + * @{ + */ +#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event + (if none of the break inputs BRK and BRK2 is active) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection + * @{ + */ +#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ +#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ +#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ +#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode + * @{ + */ +#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ +#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode TIM Slave mode + * @{ + */ +#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ +#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ +#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ +#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ +#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes + * @{ + */ +#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ +#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ +#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ +#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ +#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ +#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ +#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ +#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Selection TIM Trigger Selection + * @{ + */ +#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ +#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ +#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ +#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ +#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ +#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ +#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ +#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ +#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity + * @{ + */ +#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler + * @{ + */ +#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ +#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ +#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection + * @{ + */ +#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ +#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length + * @{ + */ +#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */ +/** + * @} + */ + +/** @defgroup DMA_Handle_index TIM DMA Handle Index + * @{ + */ +#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ +#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ +#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ +#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ +#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ +#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ +#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ +/** + * @} + */ + +/** @defgroup Channel_CC_State TIM Capture/Compare Channel State + * @{ + */ +#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ +#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ +#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ +#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup TIM_Exported_Macros TIM Exported Macros + * @{ + */ + +/** @brief Reset TIM handle state. + * @param __HANDLE__ TIM handle. + * @retval None + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->Base_MspInitCallback = NULL; \ + (__HANDLE__)->Base_MspDeInitCallback = NULL; \ + (__HANDLE__)->IC_MspInitCallback = NULL; \ + (__HANDLE__)->IC_MspDeInitCallback = NULL; \ + (__HANDLE__)->OC_MspInitCallback = NULL; \ + (__HANDLE__)->OC_MspDeInitCallback = NULL; \ + (__HANDLE__)->PWM_MspInitCallback = NULL; \ + (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET) +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @brief Enable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) + +/** + * @brief Enable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) + +/** + * @brief Disable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled + */ +#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled unconditionally + */ +#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) + +/** @brief Enable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to enable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) + +/** @brief Disable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to disable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +/** @brief Enable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to enable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + +/** @brief Disable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to disable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) + +/** @brief Check whether the specified TIM interrupt flag is set or not. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) + +/** @brief Clear the specified TIM interrupt flag. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to clear. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** + * @brief Check whether the specified TIM interrupt source is enabled or not. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval The state of TIM_IT (SET or RESET). + */ +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Clear the TIM interrupt pending bits. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) + +/** + * @brief Indicates whether or not the TIM Counter is used as downcounter. + * @param __HANDLE__ TIM handle. + * @retval False (Counter used as upcounter) or True (Counter used as downcounter) + * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder +mode. + */ +#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) + +/** + * @brief Set the TIM Prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __PRESC__ specifies the Prescaler new value. + * @retval None + */ +#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) + +/** + * @brief Set the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __COUNTER__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) + +/** + * @brief Get the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) + */ +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) + +/** + * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __AUTORELOAD__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) + +/** + * @brief Get the TIM Autoreload Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) + */ +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) + +/** + * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __CKD__ specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + * @retval None + */ +#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) + +/** + * @brief Get the TIM Clock Division value on runtime. + * @param __HANDLE__ TIM handle. + * @retval The clock division can be one of the following values: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + */ +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) + +/** + * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __ICPSC__ specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) + +/** + * @brief Get the TIM Input Capture prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get input capture 1 prescaler value + * @arg TIM_CHANNEL_2: get input capture 2 prescaler value + * @arg TIM_CHANNEL_3: get input capture 3 prescaler value + * @arg TIM_CHANNEL_4: get input capture 4 prescaler value + * @retval The input capture prescaler can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + */ +#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ + (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) + +/** + * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __COMPARE__ specifies the Capture Compare register new value. + * @retval None + */ +#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) + +/** + * @brief Get the TIM Capture Compare Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channel associated with the capture compare register + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get capture/compare 1 register value + * @arg TIM_CHANNEL_2: get capture/compare 2 register value + * @arg TIM_CHANNEL_3: get capture/compare 3 register value + * @arg TIM_CHANNEL_4: get capture/compare 4 register value + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) + */ +#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__HANDLE__)->Instance->CCR4)) + +/** + * @brief Set the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) + +/** + * @brief Reset the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) + +/** + * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is set, only counter + * overflow/underflow generates an update interrupt or DMA request (if + * enabled) + * @retval None + */ +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) + +/** + * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is reset, any of the + * following events generate an update interrupt or DMA request (if + * enabled): + * _ Counter overflow underflow + * _ Setting the UG bit + * _ Update generation through the slave mode controller + * @retval None + */ +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) + +/** + * @brief Set the TIM Capture x input polarity on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __POLARITY__ Polarity for TIx source + * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge + * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge + * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge + * @retval None + */ +#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) + +/** + * @} + */ +/* End of exported macros ----------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_Private_Constants TIM Private Constants + * @{ + */ +/* The counter of a timer instance is disabled only if all the CCx and CCxN + channels have been disabled */ +#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) +#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_Private_Macros TIM Private Macros + * @{ + */ +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) + +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR)) + +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ + ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) + +#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) + +#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ + ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) + +#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ + ((__STATE__) == TIM_OCFAST_ENABLE)) + +#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCPOLARITY_LOW)) + +#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) + +#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCIDLESTATE_RESET)) + +#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCNIDLESTATE_RESET)) + +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + +#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) + +#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_TRC)) + +#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV8)) + +#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ + ((__MODE__) == TIM_OPMODE_REPETITIVE)) + +#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ + ((__MODE__) == TIM_ENCODERMODE_TI2) || \ + ((__MODE__) == TIM_ENCODERMODE_TI12)) + +#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3) || \ + ((__CHANNEL__) == TIM_CHANNEL_4) || \ + ((__CHANNEL__) == TIM_CHANNEL_ALL)) + +#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2)) + +#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3)) + +#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1)) + +#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) + +#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) + +#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) + +#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) + +#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ + ((__STATE__) == TIM_OSSR_DISABLE)) + +#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ + ((__STATE__) == TIM_OSSI_DISABLE)) + +#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_3)) + +#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) + + +#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ + ((__STATE__) == TIM_BREAK_DISABLE)) + +#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) + +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ + ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) + +#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ + ((__SOURCE__) == TIM_TRGO_ENABLE) || \ + ((__SOURCE__) == TIM_TRGO_UPDATE) || \ + ((__SOURCE__) == TIM_TRGO_OC1) || \ + ((__SOURCE__) == TIM_TRGO_OC1REF) || \ + ((__SOURCE__) == TIM_TRGO_OC2REF) || \ + ((__SOURCE__) == TIM_TRGO_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO_OC4REF)) + +#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ + ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) + +#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ + ((__MODE__) == TIM_SLAVEMODE_RESET) || \ + ((__MODE__) == TIM_SLAVEMODE_GATED) || \ + ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ + ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) + +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2)) + +#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ + ((__MODE__) == TIM_OCMODE_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_INACTIVE) || \ + ((__MODE__) == TIM_OCMODE_TOGGLE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) + +#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_TI1F_ED) || \ + ((__SELECTION__) == TIM_TS_TI1FP1) || \ + ((__SELECTION__) == TIM_TS_TI2FP2) || \ + ((__SELECTION__) == TIM_TS_ETRF)) + +#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_NONE)) + +#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) + +#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) + +#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ + ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) + +#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) + +#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) + +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) + +#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + +#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) + +#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + +#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + +/** + * @} + */ +/* End of private macros -----------------------------------------------------*/ + +/* Include TIM HAL Extended module */ +#include "stm32f4xx_hal_tim_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * @{ + */ +/* Time Base functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * @{ + */ +/* Timer Output Compare functions *********************************************/ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * @{ + */ +/* Timer PWM functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * @{ + */ +/* Timer Input Capture functions **********************************************/ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * @{ + */ +/* Timer One Pulse functions **************************************************/ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * @{ + */ +/* Timer Encoder functions ****************************************************/ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief IRQ handler management + * @{ + */ +/* Interrupt Handler functions ***********************************************/ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Control functions *********************************************************/ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); +uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * @{ + */ +/* Callback in non blocking modes (Interrupt and DMA) *************************/ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +/* Peripheral State functions ************************************************/ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); + +void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_DMAError(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +void TIM_ResetCallback(TIM_HandleTypeDef *htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_TIM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h index 2ffd2d7d..88ce2817 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h @@ -1,356 +1,356 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.h - * @author MCD Application Team - * @brief Header file of TIM HAL Extended module. - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32F4xx_HAL_TIM_EX_H -#define STM32F4xx_HAL_TIM_EX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; -/** - * @} - */ -/* End of exported types -----------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Extended Remapping - * @{ - */ -#if defined (TIM2) -#if defined(TIM8) -#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ -#else -#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ -#endif /* TIM8 */ -#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ -#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ -#endif /* TIM2 */ - -#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ -#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ -#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ -#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ - -#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ -#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ -#if defined(SPDIFRX) -#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ -#endif /* SPDIFRX*/ - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define LPTIM_REMAP_MASK 0x10000000U - -#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ -#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ - -#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ -#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -/** - * @} - */ - -/** - * @} - */ -/* End of exported constants -------------------------------------------------*/ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros - * @{ - */ - -/** - * @} - */ -/* End of exported macro -----------------------------------------------------*/ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros - * @{ - */ -#if defined(SPDIFRX) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#elif defined(TIM2) -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE))) || \ - (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ - (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ - ((TIM_REMAP) == TIM_TIM9_LPTIM)))) -#elif defined(TIM8) -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ - (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ -#else -#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ - ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ - ((TIM_REMAP) == TIM_TIM5_LSI) || \ - ((TIM_REMAP) == TIM_TIM5_LSE) || \ - ((TIM_REMAP) == TIM_TIM5_RTC))) || \ - (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ - ((TIM_REMAP) == TIM_TIM11_HSE)))) -#endif /* SPDIFRX */ - -/** - * @} - */ -/* End of private macro ------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); - -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ -/* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * @{ - */ -/* Extended Callback **********************************************************/ -void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * @{ - */ -/* Extended Peripheral State functions ***************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** - * @} - */ -/* End of exported functions -------------------------------------------------*/ - -/* Private functions----------------------------------------------------------*/ -/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions - * @{ - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* End of private functions --------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* STM32F4xx_HAL_TIM_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.h + * @author MCD Application Team + * @brief Header file of TIM HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_EX_H +#define STM32F4xx_HAL_TIM_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIMEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types + * @{ + */ + +/** + * @brief TIM Hall sensor Configuration Structure definition + */ + +typedef struct +{ + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ +} TIM_HallSensor_InitTypeDef; +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants + * @{ + */ + +/** @defgroup TIMEx_Remap TIM Extended Remapping + * @{ + */ +#if defined (TIM2) +#if defined(TIM8) +#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ +#else +#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ +#endif /* TIM8 */ +#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ +#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ +#endif /* TIM2 */ + +#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ +#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ +#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ +#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ + +#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ +#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ +#if defined(SPDIFRX) +#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ +#endif /* SPDIFRX*/ + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define LPTIM_REMAP_MASK 0x10000000U + +#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ +#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros + * @{ + */ + +/** + * @} + */ +/* End of exported macro -----------------------------------------------------*/ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros + * @{ + */ +#if defined(SPDIFRX) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#elif defined(TIM2) +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE))) || \ + (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ + (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM9_LPTIM)))) +#elif defined(TIM8) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* SPDIFRX */ + +/** + * @} + */ +/* End of private macro ------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * @{ + */ +/* Timer Hall Sensor functions **********************************************/ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); + +void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); + +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * @{ + */ +/* Timer Complementary Output Compare functions *****************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * @{ + */ +/* Timer Complementary PWM functions ****************************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * @{ + */ +/* Timer Complementary One Pulse functions **********************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Extended Control functions ************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * @{ + */ +/* Extended Callback **********************************************************/ +void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * @{ + */ +/* Extended Peripheral State functions ***************************************/ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F4xx_HAL_TIM_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c index a27c14c7..245147a1 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -1,615 +1,615 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal.c - * @author MCD Application Team - * @brief HAL module driver. - * This is the common part of the HAL initialization - * - @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 - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL HAL - * @brief HAL module driver. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup HAL_Private_Constants - * @{ - */ -/** - * @brief STM32F4xx HAL Driver version number V1.7.8 - */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x08U) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ -#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ - |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ - |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ - |(__STM32F4xx_HAL_VERSION_RC)) - -#define IDCODE_DEVID_MASK 0x00000FFFU - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- MEMRMP Register ---*/ -/* Alias word address of UFB_MODE bit */ -#define MEMRMP_OFFSET SYSCFG_OFFSET -#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos -#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) -#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos -#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) - -/* --- MCHDLYCR Register ---*/ -/* Alias word address of BSCKSEL bit */ -#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) -#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos -#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup HAL_Private_Variables - * @{ - */ -__IO uint32_t uwTick; -uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ -HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_Exported_Functions HAL Exported Functions - * @{ - */ - -/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initializes the Flash interface the NVIC allocation and initial clock - configuration. It initializes the systick also when timeout is needed - and the backup domain when enabled. - (+) De-Initializes common part of the HAL. - (+) Configure the time base source to have 1ms time base with a dedicated - Tick interrupt priority. - (++) SysTick timer is used by default as source of time base, but user - can eventually implement his proper time base source (a general purpose - timer for example or other time source), keeping in mind that Time base - duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and - handled in milliseconds basis. - (++) Time base configuration function (HAL_InitTick ()) is called automatically - at the beginning of the program after reset by HAL_Init() or at any time - when clock is configured, by HAL_RCC_ClockConfig(). - (++) Source of time base is configured to generate interrupts at regular - time intervals. Care must be taken if HAL_Delay() is called from a - peripheral ISR process, the Tick interrupt line must have higher priority - (numerically lower) than the peripheral interrupt. Otherwise the caller - ISR process will be blocked. - (++) functions affecting time base configurations are declared as __weak - to make override possible in case of other implementations in user file. -@endverbatim - * @{ - */ - -/** - * @brief This function is used to initialize the HAL Library; it must be the first - * instruction to be executed in the main program (before to call any other - * HAL function), it performs the following: - * Configure the Flash prefetch, instruction and Data caches. - * Configures the SysTick to generate an interrupt each 1 millisecond, - * which is clocked by the HSI (at this stage, the clock is not yet - * configured and thus the system is running from the internal HSI at 16 MHz). - * Set NVIC Group Priority to 4. - * Calls the HAL_MspInit() callback function defined in user file - * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization - * - * @note SysTick is used as time base for the HAL_Delay() function, the application - * need to ensure that the SysTick time base is always set to 1 millisecond - * to have correct HAL operation. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_Init(void) -{ - /* Configure Flash prefetch, Instruction cache, Data cache */ -#if (INSTRUCTION_CACHE_ENABLE != 0U) - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (DATA_CACHE_ENABLE != 0U) - __HAL_FLASH_DATA_CACHE_ENABLE(); -#endif /* DATA_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Set Interrupt Group Priority */ - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - /* Init the low level hardware */ - HAL_MspInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function de-Initializes common part of the HAL and stops the systick. - * This function is optional. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DeInit(void) -{ - /* Reset of all peripherals */ - __HAL_RCC_APB1_FORCE_RESET(); - __HAL_RCC_APB1_RELEASE_RESET(); - - __HAL_RCC_APB2_FORCE_RESET(); - __HAL_RCC_APB2_RELEASE_RESET(); - - __HAL_RCC_AHB1_FORCE_RESET(); - __HAL_RCC_AHB1_RELEASE_RESET(); - - __HAL_RCC_AHB2_FORCE_RESET(); - __HAL_RCC_AHB2_RELEASE_RESET(); - - __HAL_RCC_AHB3_FORCE_RESET(); - __HAL_RCC_AHB3_RELEASE_RESET(); - - /* De-Init the low level hardware */ - HAL_MspDeInit(); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initialize the MSP. - * @retval None - */ -__weak void HAL_MspInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the MSP. - * @retval None - */ -__weak void HAL_MspDeInit(void) -{ - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief This function configures the source of the time base. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). - * @note In the default implementation, SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals. - * Care must be taken if HAL_Delay() is called from a peripheral ISR process, - * The SysTick interrupt must have higher priority (numerically lower) - * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. - * The function is declared as __weak to be overwritten in case of other - * implementation in user file. - * @param TickPriority Tick interrupt priority. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - /* Configure the SysTick to have interrupt in 1ms time basis*/ - if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - { - return HAL_ERROR; - } - - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - return HAL_ERROR; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions - * @brief HAL Control functions - * -@verbatim - =============================================================================== - ##### HAL Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Provide a tick value in millisecond - (+) Provide a blocking delay in millisecond - (+) Suspend the time base source interrupt - (+) Resume the time base source interrupt - (+) Get the HAL API driver version - (+) Get the device identifier - (+) Get the device revision identifier - (+) Enable/Disable Debug module during SLEEP mode - (+) Enable/Disable Debug module during STOP mode - (+) Enable/Disable Debug module during STANDBY mode - -@endverbatim - * @{ - */ - -/** - * @brief This function is called to increment a global variable "uwTick" - * used as application time base. - * @note In the default implementation, this variable is incremented each 1ms - * in SysTick ISR. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_IncTick(void) -{ - uwTick += uwTickFreq; -} - -/** - * @brief Provides a tick value in millisecond. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval tick value - */ -__weak uint32_t HAL_GetTick(void) -{ - return uwTick; -} - -/** - * @brief This function returns a tick priority. - * @retval tick priority - */ -uint32_t HAL_GetTickPrio(void) -{ - return uwTickPrio; -} - -/** - * @brief Set new tick Freq. - * @retval Status - */ -HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) -{ - HAL_StatusTypeDef status = HAL_OK; - HAL_TickFreqTypeDef prevTickFreq; - - assert_param(IS_TICKFREQ(Freq)); - - if (uwTickFreq != Freq) - { - /* Back up uwTickFreq frequency */ - prevTickFreq = uwTickFreq; - - /* Update uwTickFreq global variable used by HAL_InitTick() */ - uwTickFreq = Freq; - - /* Apply the new tick Freq */ - status = HAL_InitTick(uwTickPrio); - - if (status != HAL_OK) - { - /* Restore previous tick frequency */ - uwTickFreq = prevTickFreq; - } - } - - return status; -} - -/** - * @brief Return tick frequency. - * @retval tick period in Hz - */ -HAL_TickFreqTypeDef HAL_GetTickFreq(void) -{ - return uwTickFreq; -} - -/** - * @brief This function provides minimum delay (in milliseconds) based - * on variable incremented. - * @note In the default implementation , SysTick timer is the source of time base. - * It is used to generate interrupts at regular time intervals where uwTick - * is incremented. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = Delay; - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - { - wait += (uint32_t)(uwTickFreq); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/** - * @brief Suspend Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() - * is called, the SysTick interrupt will be disabled and so Tick increment - * is suspended. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_SuspendTick(void) -{ - /* Disable SysTick Interrupt */ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Resume Tick increment. - * @note In the default implementation , SysTick timer is the source of time base. It is - * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() - * is called, the SysTick interrupt will be enabled and so Tick increment - * is resumed. - * @note This function is declared as __weak to be overwritten in case of other - * implementations in user file. - * @retval None - */ -__weak void HAL_ResumeTick(void) -{ - /* Enable SysTick Interrupt */ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - -/** - * @brief Returns the HAL revision - * @retval version : 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t HAL_GetHalVersion(void) -{ - return __STM32F4xx_HAL_VERSION; -} - -/** - * @brief Returns the device revision identifier. - * @retval Device revision identifier - */ -uint32_t HAL_GetREVID(void) -{ - return((DBGMCU->IDCODE) >> 16U); -} - -/** - * @brief Returns the device identifier. - * @retval Device identifier - */ -uint32_t HAL_GetDEVID(void) -{ - return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); -} - -/** - * @brief Enable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGSleepMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Disable the Debug Module during SLEEP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGSleepMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); -} - -/** - * @brief Enable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStopMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Disable the Debug Module during STOP mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStopMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); -} - -/** - * @brief Enable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_EnableDBGStandbyMode(void) -{ - SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Disable the Debug Module during STANDBY mode - * @retval None - */ -void HAL_DBGMCU_DisableDBGStandbyMode(void) -{ - CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); -} - -/** - * @brief Enables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_EnableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; -} - -/** - * @brief Power-down the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @retval None - */ -void HAL_DisableCompensationCell(void) -{ - *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns first word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw0(void) -{ - return (READ_REG(*((uint32_t *)UID_BASE))); -} - -/** - * @brief Returns second word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw1(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); -} - -/** - * @brief Returns third word of the unique device identifier (UID based on 96 bits) - * @retval Device identifier - */ -uint32_t HAL_GetUIDw2(void) -{ - return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Enables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_EnableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Internal FLASH Bank Swapping. - * - * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. - * - * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) - * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) - * - * @retval None - */ -void HAL_DisableMemorySwappingBank(void) -{ - *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + @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 + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup HAL_Private_Constants + * @{ + */ +/** + * @brief STM32F4xx HAL Driver version number V1.7.8 + */ +#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_HAL_VERSION_SUB2 (0x08U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ + |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ + |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ + |(__STM32F4xx_HAL_VERSION_RC)) + +#define IDCODE_DEVID_MASK 0x00000FFFU + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) +/* --- MEMRMP Register ---*/ +/* Alias word address of UFB_MODE bit */ +#define MEMRMP_OFFSET SYSCFG_OFFSET +#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos +#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) + +/* --- CMPCR Register ---*/ +/* Alias word address of CMP_PD bit */ +#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) +#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos +#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) + +/* --- MCHDLYCR Register ---*/ +/* Alias word address of BSCKSEL bit */ +#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) +#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos +#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup HAL_Private_Variables + * @{ + */ +__IO uint32_t uwTick; +uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ +HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Functions HAL Exported Functions + * @{ + */ + +/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initializes the Flash interface the NVIC allocation and initial clock + configuration. It initializes the systick also when timeout is needed + and the backup domain when enabled. + (+) De-Initializes common part of the HAL. + (+) Configure the time base source to have 1ms time base with a dedicated + Tick interrupt priority. + (++) SysTick timer is used by default as source of time base, but user + can eventually implement his proper time base source (a general purpose + timer for example or other time source), keeping in mind that Time base + duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and + handled in milliseconds basis. + (++) Time base configuration function (HAL_InitTick ()) is called automatically + at the beginning of the program after reset by HAL_Init() or at any time + when clock is configured, by HAL_RCC_ClockConfig(). + (++) Source of time base is configured to generate interrupts at regular + time intervals. Care must be taken if HAL_Delay() is called from a + peripheral ISR process, the Tick interrupt line must have higher priority + (numerically lower) than the peripheral interrupt. Otherwise the caller + ISR process will be blocked. + (++) functions affecting time base configurations are declared as __weak + to make override possible in case of other implementations in user file. +@endverbatim + * @{ + */ + +/** + * @brief This function is used to initialize the HAL Library; it must be the first + * instruction to be executed in the main program (before to call any other + * HAL function), it performs the following: + * Configure the Flash prefetch, instruction and Data caches. + * Configures the SysTick to generate an interrupt each 1 millisecond, + * which is clocked by the HSI (at this stage, the clock is not yet + * configured and thus the system is running from the internal HSI at 16 MHz). + * Set NVIC Group Priority to 4. + * Calls the HAL_MspInit() callback function defined in user file + * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization + * + * @note SysTick is used as time base for the HAL_Delay() function, the application + * need to ensure that the SysTick time base is always set to 1 millisecond + * to have correct HAL operation. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_Init(void) +{ + /* Configure Flash prefetch, Instruction cache, Data cache */ +#if (INSTRUCTION_CACHE_ENABLE != 0U) + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); +#endif /* INSTRUCTION_CACHE_ENABLE */ + +#if (DATA_CACHE_ENABLE != 0U) + __HAL_FLASH_DATA_CACHE_ENABLE(); +#endif /* DATA_CACHE_ENABLE */ + +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ + HAL_InitTick(TICK_INT_PRIORITY); + + /* Init the low level hardware */ + HAL_MspInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief This function de-Initializes common part of the HAL and stops the systick. + * This function is optional. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DeInit(void) +{ + /* Reset of all peripherals */ + __HAL_RCC_APB1_FORCE_RESET(); + __HAL_RCC_APB1_RELEASE_RESET(); + + __HAL_RCC_APB2_FORCE_RESET(); + __HAL_RCC_APB2_RELEASE_RESET(); + + __HAL_RCC_AHB1_FORCE_RESET(); + __HAL_RCC_AHB1_RELEASE_RESET(); + + __HAL_RCC_AHB2_FORCE_RESET(); + __HAL_RCC_AHB2_RELEASE_RESET(); + + __HAL_RCC_AHB3_FORCE_RESET(); + __HAL_RCC_AHB3_RELEASE_RESET(); + + /* De-Init the low level hardware */ + HAL_MspDeInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Initialize the MSP. + * @retval None + */ +__weak void HAL_MspInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the MSP. + * @retval None + */ +__weak void HAL_MspDeInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief This function configures the source of the time base. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). + * @note In the default implementation, SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals. + * Care must be taken if HAL_Delay() is called from a peripheral ISR process, + * The SysTick interrupt must have higher priority (numerically lower) + * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. + * The function is declared as __weak to be overwritten in case of other + * implementation in user file. + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + /* Configure the SysTick to have interrupt in 1ms time basis*/ + if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + { + return HAL_ERROR; + } + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + return HAL_ERROR; + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions + * @brief HAL Control functions + * +@verbatim + =============================================================================== + ##### HAL Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Provide a tick value in millisecond + (+) Provide a blocking delay in millisecond + (+) Suspend the time base source interrupt + (+) Resume the time base source interrupt + (+) Get the HAL API driver version + (+) Get the device identifier + (+) Get the device revision identifier + (+) Enable/Disable Debug module during SLEEP mode + (+) Enable/Disable Debug module during STOP mode + (+) Enable/Disable Debug module during STANDBY mode + +@endverbatim + * @{ + */ + +/** + * @brief This function is called to increment a global variable "uwTick" + * used as application time base. + * @note In the default implementation, this variable is incremented each 1ms + * in SysTick ISR. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_IncTick(void) +{ + uwTick += uwTickFreq; +} + +/** + * @brief Provides a tick value in millisecond. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval tick value + */ +__weak uint32_t HAL_GetTick(void) +{ + return uwTick; +} + +/** + * @brief This function returns a tick priority. + * @retval tick priority + */ +uint32_t HAL_GetTickPrio(void) +{ + return uwTickPrio; +} + +/** + * @brief Set new tick Freq. + * @retval Status + */ +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + + assert_param(IS_TICKFREQ(Freq)); + + if (uwTickFreq != Freq) + { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ + uwTickFreq = Freq; + + /* Apply the new tick Freq */ + status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } + } + + return status; +} + +/** + * @brief Return tick frequency. + * @retval tick period in Hz + */ +HAL_TickFreqTypeDef HAL_GetTickFreq(void) +{ + return uwTickFreq; +} + +/** + * @brief This function provides minimum delay (in milliseconds) based + * on variable incremented. + * @note In the default implementation , SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals where uwTick + * is incremented. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +__weak void HAL_Delay(uint32_t Delay) +{ + uint32_t tickstart = HAL_GetTick(); + uint32_t wait = Delay; + + /* Add a freq to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + { + wait += (uint32_t)(uwTickFreq); + } + + while((HAL_GetTick() - tickstart) < wait) + { + } +} + +/** + * @brief Suspend Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() + * is called, the SysTick interrupt will be disabled and so Tick increment + * is suspended. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_SuspendTick(void) +{ + /* Disable SysTick Interrupt */ + SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Resume Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() + * is called, the SysTick interrupt will be enabled and so Tick increment + * is resumed. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_ResumeTick(void) +{ + /* Enable SysTick Interrupt */ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Returns the HAL revision + * @retval version : 0xXYZR (8bits for each decimal, R for RC) + */ +uint32_t HAL_GetHalVersion(void) +{ + return __STM32F4xx_HAL_VERSION; +} + +/** + * @brief Returns the device revision identifier. + * @retval Device revision identifier + */ +uint32_t HAL_GetREVID(void) +{ + return((DBGMCU->IDCODE) >> 16U); +} + +/** + * @brief Returns the device identifier. + * @retval Device identifier + */ +uint32_t HAL_GetDEVID(void) +{ + return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Enables the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_EnableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; +} + +/** + * @brief Power-down the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_DisableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns first word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw0(void) +{ + return (READ_REG(*((uint32_t *)UID_BASE))); +} + +/** + * @brief Returns second word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw1(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); +} + +/** + * @brief Returns third word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw2(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Enables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_EnableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_DisableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c index f4ad9fa9..2efb9864 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c @@ -1,505 +1,505 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_cortex.c - * @author MCD Application Team - * @brief CORTEX HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the CORTEX: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - - [..] - *** How to configure Interrupts using CORTEX HAL driver *** - =========================================================== - [..] - This section provides functions allowing to configure the NVIC interrupts (IRQ). - The Cortex-M4 exceptions are managed by CMSIS functions. - - (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() - function according to the following table. - (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). - (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programming manual for details in how to configure priority. - - -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. - The pending IRQ priority will be managed only by the sub priority. - - -@- IRQ priority order (sorted by highest to lowest priority): - (+@) Lowest preemption priority - (+@) Lowest sub priority - (+@) Lowest hardware priority (IRQ number) - - [..] - *** How to configure Systick using CORTEX HAL driver *** - ======================================================== - [..] - Setup SysTick Timer for time base. - - (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which - is a CMSIS function that: - (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value 0x0F. - (++) Resets the SysTick Counter register. - (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). - (++) Enables the SysTick Interrupt. - (++) Starts the SysTick Counter. - - (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro - __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the - HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined - inside the stm32f4xx_hal_cortex.h file. - - (+) You can change the SysTick IRQ priority by calling the - HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function - call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. - - (+) To adjust the SysTick time base, use the following formula: - - Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function - (++) Reload Value should not exceed 0xFFFFFF - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup CORTEX CORTEX - * @brief CORTEX HAL module driver - * @{ - */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions - * @{ - */ - - -/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides the CORTEX HAL driver functions allowing to configure Interrupts - Systick functionalities - -@endverbatim - * @{ - */ - - -/** - * @brief Sets the priority grouping field (preemption priority and subpriority) - * using the required unlock sequence. - * @param PriorityGroup The priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ - NVIC_SetPriorityGrouping(PriorityGroup); -} - -/** - * @brief Sets the priority of an interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @param PreemptPriority The preemption priority for the IRQn channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority - * @param SubPriority the subpriority level for the IRQ channel. - * This parameter can be a value between 0 and 15 - * A lower priority value indicates a higher priority. - * @retval None - */ -void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t prioritygroup = 0x00U; - - /* Check the parameters */ - assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); - - prioritygroup = NVIC_GetPriorityGrouping(); - - NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); -} - -/** - * @brief Enables a device specific interrupt in the NVIC interrupt controller. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Enable interrupt */ - NVIC_EnableIRQ(IRQn); -} - -/** - * @brief Disables a device specific interrupt in the NVIC interrupt controller. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Disable interrupt */ - NVIC_DisableIRQ(IRQn); -} - -/** - * @brief Initiates a system reset request to reset the MCU. - * @retval None - */ -void HAL_NVIC_SystemReset(void) -{ - /* System Reset */ - NVIC_SystemReset(); -} - -/** - * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. - * Counter is in free running mode to generate periodic interrupts. - * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. - * @retval status: - 0 Function succeeded. - * - 1 Function failed. - */ -uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) -{ - return SysTick_Config(TicksNumb); -} -/** - * @} - */ - -/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions - * @brief Cortex control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the CORTEX - (NVIC, SYSTICK, MPU) functionalities. - - -@endverbatim - * @{ - */ - -#if (__MPU_PRESENT == 1U) -/** - * @brief Disables the MPU - * @retval None - */ -void HAL_MPU_Disable(void) -{ - /* Make sure outstanding transfers are done */ - __DMB(); - - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU and clear the control register*/ - MPU->CTRL = 0U; -} - -/** - * @brief Enable the MPU. - * @param MPU_Control Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; - - /* Ensure MPU setting take effects */ - __DSB(); - __ISB(); -} - -/** - * @brief 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)); - - /* Set the Region number */ - MPU->RNR = MPU_Init->Number; - - if ((MPU_Init->Enable) != RESET) - { - /* Check the parameters */ - 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)); - - 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); - } - else - { - MPU->RBAR = 0x00U; - MPU->RASR = 0x00U; - } -} -#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 (stm32f4xxxx.h)) - * @param PriorityGroup the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority - * 4 bits for subpriority - * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority - * 3 bits for subpriority - * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority - * 2 bits for subpriority - * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority - * 1 bits for subpriority - * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority - * 0 bits for subpriority - * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). - * @param pSubPriority Pointer on the Subpriority value (starting from 0). - * @retval None - */ -void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); - /* Get priority for Cortex-M system or device specific interrupts */ - NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); -} - -/** - * @brief Sets Pending bit of an external interrupt. - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Set interrupt pending */ - NVIC_SetPendingIRQ(IRQn); -} - -/** - * @brief Gets Pending Interrupt (reads the pending register in the NVIC - * and returns the pending bit for the specified interrupt). - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if pending else 0 */ - return NVIC_GetPendingIRQ(IRQn); -} - -/** - * @brief Clears the pending bit of an external interrupt. - * @param IRQn External interrupt number. - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval None - */ -void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Clear pending interrupt */ - NVIC_ClearPendingIRQ(IRQn); -} - -/** - * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). - * @param IRQn External interrupt number - * This parameter can be an enumerator of IRQn_Type enumeration - * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) - * @retval status: - 0 Interrupt status is not pending. - * - 1 Interrupt status is pending. - */ -uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) -{ - /* Check the parameters */ - assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); - - /* Return 1 if active else 0 */ - return NVIC_GetActive(IRQn); -} - -/** - * @brief Configures the SysTick clock source. - * @param CLKSource specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); - if (CLKSource == SYSTICK_CLKSOURCE_HCLK) - { - SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; - } - else - { - SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; - } -} - -/** - * @brief This function handles SYSTICK interrupt request. - * @retval None - */ -void HAL_SYSTICK_IRQHandler(void) -{ - HAL_SYSTICK_Callback(); -} - -/** - * @brief SYSTICK callback. - * @retval None - */ -__weak void HAL_SYSTICK_Callback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SYSTICK_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CORTEX_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.c + * @author MCD Application Team + * @brief CORTEX HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the CORTEX: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + + [..] + *** How to configure Interrupts using CORTEX HAL driver *** + =========================================================== + [..] + This section provides functions allowing to configure the NVIC interrupts (IRQ). + The Cortex-M4 exceptions are managed by CMSIS functions. + + (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() + function according to the following table. + (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). + (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). + (#) please refer to programming manual for details in how to configure priority. + + -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. + The pending IRQ priority will be managed only by the sub priority. + + -@- IRQ priority order (sorted by highest to lowest priority): + (+@) Lowest preemption priority + (+@) Lowest sub priority + (+@) Lowest hardware priority (IRQ number) + + [..] + *** How to configure Systick using CORTEX HAL driver *** + ======================================================== + [..] + Setup SysTick Timer for time base. + + (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which + is a CMSIS function that: + (++) Configures the SysTick Reload register with value passed as function parameter. + (++) Configures the SysTick IRQ priority to the lowest value 0x0F. + (++) Resets the SysTick Counter register. + (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). + (++) Enables the SysTick Interrupt. + (++) Starts the SysTick Counter. + + (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro + __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the + HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined + inside the stm32f4xx_hal_cortex.h file. + + (+) You can change the SysTick IRQ priority by calling the + HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function + call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. + + (+) To adjust the SysTick time base, use the following formula: + + Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) + (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function + (++) Reload Value should not exceed 0xFFFFFF + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup CORTEX CORTEX + * @brief CORTEX HAL module driver + * @{ + */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions + * @{ + */ + + +/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] + This section provides the CORTEX HAL driver functions allowing to configure Interrupts + Systick functionalities + +@endverbatim + * @{ + */ + + +/** + * @brief Sets the priority grouping field (preemption priority and subpriority) + * using the required unlock sequence. + * @param PriorityGroup The priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. + * The pending IRQ priority will be managed only by the subpriority. + * @retval None + */ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); +} + +/** + * @brief Sets the priority of an interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @param PreemptPriority The preemption priority for the IRQn channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority + * @param SubPriority the subpriority level for the IRQ channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority. + * @retval None + */ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t prioritygroup = 0x00U; + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); +} + +/** + * @brief Enables a device specific interrupt in the NVIC interrupt controller. + * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + * function should be called before. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); +} + +/** + * @brief Disables a device specific interrupt in the NVIC interrupt controller. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Disable interrupt */ + NVIC_DisableIRQ(IRQn); +} + +/** + * @brief Initiates a system reset request to reset the MCU. + * @retval None + */ +void HAL_NVIC_SystemReset(void) +{ + /* System Reset */ + NVIC_SystemReset(); +} + +/** + * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. + * Counter is in free running mode to generate periodic interrupts. + * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. + * @retval status: - 0 Function succeeded. + * - 1 Function failed. + */ +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) +{ + return SysTick_Config(TicksNumb); +} +/** + * @} + */ + +/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions + * @brief Cortex control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the CORTEX + (NVIC, SYSTICK, MPU) functionalities. + + +@endverbatim + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** + * @brief Disables the MPU + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + +/** + * @brief Enable the MPU. + * @param MPU_Control Specifies the control mode of the MPU during hard fault, + * NMI, FAULTMASK and privileged access to the default memory + * This parameter can be one of the following values: + * @arg MPU_HFNMI_PRIVDEF_NONE + * @arg MPU_HARDFAULT_NMI + * @arg MPU_PRIVILEGED_DEFAULT + * @arg MPU_HFNMI_PRIVDEF + * @retval None + */ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + +/** + * @brief 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)); + + /* Set the Region number */ + MPU->RNR = MPU_Init->Number; + + if ((MPU_Init->Enable) != RESET) + { + /* Check the parameters */ + 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)); + + 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); + } + else + { + MPU->RBAR = 0x00U; + MPU->RASR = 0x00U; + } +} +#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 (stm32f4xxxx.h)) + * @param PriorityGroup the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). + * @param pSubPriority Pointer on the Subpriority value (starting from 0). + * @retval None + */ +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + /* Get priority for Cortex-M system or device specific interrupts */ + NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); +} + +/** + * @brief Sets Pending bit of an external interrupt. + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Set interrupt pending */ + NVIC_SetPendingIRQ(IRQn); +} + +/** + * @brief Gets Pending Interrupt (reads the pending register in the NVIC + * and returns the pending bit for the specified interrupt). + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if pending else 0 */ + return NVIC_GetPendingIRQ(IRQn); +} + +/** + * @brief Clears the pending bit of an external interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Clear pending interrupt */ + NVIC_ClearPendingIRQ(IRQn); +} + +/** + * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if active else 0 */ + return NVIC_GetActive(IRQn); +} + +/** + * @brief Configures the SysTick clock source. + * @param CLKSource specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + { + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } + else + { + SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + } +} + +/** + * @brief This function handles SYSTICK interrupt request. + * @retval None + */ +void HAL_SYSTICK_IRQHandler(void) +{ + HAL_SYSTICK_Callback(); +} + +/** + * @brief SYSTICK callback. + * @retval None + */ +__weak void HAL_SYSTICK_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_SYSTICK_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CORTEX_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c index 281f9c20..69d848f3 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c @@ -1,1305 +1,1305 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma.c - * @author MCD Application Team - * @brief DMA HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access (DMA) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and errors functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable and configure the peripheral to be connected to the DMA Stream - (except for internal SRAM/FLASH memories: no initialization is - necessary) please refer to Reference manual for connection between peripherals - and DMA requests. - - (#) For a given Stream, program the required configuration through the following parameters: - Transfer Direction, Source and Destination data formats, - Circular, Normal or peripheral flow control mode, Stream Priority level, - Source and Destination Increment mode, FIFO mode and its Threshold (if needed), - Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. - - -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: - __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). - - *** Polling mode IO operation *** - ================================= - [..] - (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source - address and destination address and the Length of data to be transferred. - (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this - case a fixed Timeout can be configured by User depending from his application. - (+) Use HAL_DMA_Abort() function to abort the current transfer. - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() - (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() - (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of - Source address and destination address and the Length of data to be transferred. In this - case the DMA interrupt is configured - (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine - (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can - add his own function by customization of function pointer XferCpltCallback and - XferErrorCallback (i.e a member of DMA handle structure). - [..] - (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error - detection. - - (#) Use HAL_DMA_Abort_IT() function to abort the current transfer - - -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. - - -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - Half-Word data size for the peripheral to access its data register and set Word data size - for the Memory to gain in access time. Each two half words will be packed and written in - a single access to a Word in the Memory). - - -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - and Destination. In this case the Peripheral Data Size will be applied to both Source - and Destination. - - *** DMA HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DMA HAL driver. - - (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. - (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. - (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. - - [..] - (@) You can refer to the DMA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMA DMA - * @brief DMA HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -typedef struct -{ - __IO uint32_t ISR; /*!< DMA interrupt status register */ - __IO uint32_t Reserved0; - __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ -} DMA_Base_Registers; - -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Constants - * @{ - */ - #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Private_Functions - * @{ - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); - -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @addtogroup DMA_Exported_Functions - * @{ - */ - -/** @addtogroup DMA_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - circular/normal mode selection, memory-to-memory mode selection and Stream priority value. - [..] - The HAL_DMA_Init() function follows the DMA configuration procedures as described in - reference manual. - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the DMA according to the specified - * parameters in the DMA_InitTypeDef and create the associated handle. - * @param hdma Pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0U; - uint32_t tickstart = HAL_GetTick(); - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); - assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); - assert_param(IS_DMA_MODE(hdma->Init.Mode)); - assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); - /* Check the memory burst, peripheral burst and FIFO threshold parameters only - when FIFO mode is enabled */ - if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) - { - assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); - } - - /* Allocate lock resource */ - __HAL_UNLOCK(hdma); - - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Get the CR register value */ - tmp = hdma->Instance->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ - tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); - - /* Prepare the DMA Stream configuration */ - tmp |= hdma->Init.Channel | hdma->Init.Direction | - hdma->Init.PeriphInc | hdma->Init.MemInc | - hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | - hdma->Init.Mode | hdma->Init.Priority; - - /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get memory burst and peripheral burst */ - tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; - } - - /* Write to DMA Stream CR register */ - hdma->Instance->CR = tmp; - - /* Get the FCR register value */ - tmp = hdma->Instance->FCR; - - /* Clear Direct mode and FIFO threshold bits */ - tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Prepare the DMA Stream FIFO configuration */ - tmp |= hdma->Init.FIFOMode; - - /* The FIFO threshold is not used when the FIFO mode is disabled */ - if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) - { - /* Get the FIFO threshold */ - tmp |= hdma->Init.FIFOThreshold; - - /* Check compatibility between FIFO threshold level and size of the memory burst */ - /* for INCR4, INCR8, INCR16 bursts */ - if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) - { - if (DMA_CheckFifoParam(hdma) != HAL_OK) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - } - - /* Write to DMA Stream FCR */ - hdma->Instance->FCR = tmp; - - /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate - DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clear all interrupt flags */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Initialize the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the DMA peripheral - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) -{ - DMA_Base_Registers *regs; - - /* Check the DMA peripheral state */ - if(hdma == NULL) - { - return HAL_ERROR; - } - - /* Check the DMA peripheral state */ - if(hdma->State == HAL_DMA_STATE_BUSY) - { - /* Return error status */ - return HAL_BUSY; - } - - /* Check the parameters */ - assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); - - /* Disable the selected DMA Streamx */ - __HAL_DMA_DISABLE(hdma); - - /* Reset DMA Streamx control register */ - hdma->Instance->CR = 0U; - - /* Reset DMA Streamx number of data to transfer register */ - hdma->Instance->NDTR = 0U; - - /* Reset DMA Streamx peripheral address register */ - hdma->Instance->PAR = 0U; - - /* Reset DMA Streamx memory 0 address register */ - hdma->Instance->M0AR = 0U; - - /* Reset DMA Streamx memory 1 address register */ - hdma->Instance->M1AR = 0U; - - /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = 0x00000021U; - - /* Get DMA steam Base Address */ - regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); - - /* Clean all callbacks */ - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Reset the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Reset the DMA state */ - hdma->State = HAL_DMA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return HAL_OK; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group2 - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and Start DMA transfer - (+) Configure the source, destination address and data length and - Start DMA transfer with interrupt - (+) Abort DMA transfer - (+) Poll for transfer complete - (+) Handle DMA interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Starts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Start the DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Configure the source, destination address and the data length */ - DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - - if(hdma->XferHalfCpltCallback != NULL) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the Peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - - return status; -} - -/** - * @brief Aborts the DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * - * @note After disabling a DMA Stream, a check for wait until the DMA Stream is - * effectively disabled is added. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) -{ - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - uint32_t tickstart = HAL_GetTick(); - - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - return HAL_ERROR; - } - else - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - /* Check if the DMA Stream is effectively disabled */ - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state*/ - hdma->State = HAL_DMA_STATE_READY; - } - return HAL_OK; -} - -/** - * @brief Aborts the DMA Transfer in Interrupt mode. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) -{ - if(hdma->State != HAL_DMA_STATE_BUSY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - return HAL_ERROR; - } - else - { - /* Set Abort State */ - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - } - - return HAL_OK; -} - -/** - * @brief Polling for transfer complete. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CompleteLevel Specifies the DMA level complete. - * @note The polling mode is kept in this version for legacy. it is recommanded to use the IT model instead. - * This model could be used for debug purpose. - * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). - * @param Timeout Timeout duration. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t mask_cpltlevel; - uint32_t tickstart = HAL_GetTick(); - uint32_t tmpisr; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs; - - if(HAL_DMA_STATE_BUSY != hdma->State) - { - /* No transfer ongoing */ - hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; - __HAL_UNLOCK(hdma); - return HAL_ERROR; - } - - /* Polling mode not supported in circular mode and double buffering mode */ - if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - } - else - { - /* Half Transfer Complete flag */ - mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - } - - regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - tmpisr = regs->ISR; - - while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) - { - /* Check for the Timeout (Not applicable in circular mode)*/ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_TIMEOUT; - } - } - - /* Get the ISR register value */ - tmpisr = regs->ISR; - - if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - } - - if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - - /* Clear the Direct Mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - } - } - - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - HAL_DMA_Abort(hdma); - - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State= HAL_DMA_STATE_READY; - - return HAL_ERROR; - } - } - - /* Get the level transfer complete flag */ - if(CompleteLevel == HAL_DMA_FULL_TRANSFER) - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - hdma->State = HAL_DMA_STATE_READY; - } - else - { - /* Clear the half transfer and transfer complete flags */ - regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; - } - - return status; -} - -/** - * @brief Handles DMA interrupt request. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) -{ - uint32_t tmpisr; - __IO uint32_t count = 0U; - uint32_t timeout = SystemCoreClock / 9600U; - - /* calculate DMA base and stream number */ - DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; - - tmpisr = regs->ISR; - - /* Transfer Error Interrupt management ***************************************/ - if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) - { - /* Disable the transfer error interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TE); - - /* Clear the transfer error flag */ - regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_TE; - } - } - /* FIFO Error Interrupt management ******************************************/ - if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) - { - /* Clear the FIFO error flag */ - regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_FE; - } - } - /* Direct Mode Error Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) - { - /* Clear the direct mode error flag */ - regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; - - /* Update error code */ - hdma->ErrorCode |= HAL_DMA_ERROR_DME; - } - } - /* Half Transfer Complete Interrupt management ******************************/ - if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) - { - /* Clear the half transfer complete flag */ - regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; - - /* Multi_Buffering mode enabled */ - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferM1HalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferM1HalfCpltCallback(hdma); - } - } - } - else - { - /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the half transfer interrupt */ - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - if(hdma->XferHalfCpltCallback != NULL) - { - /* Half transfer callback */ - hdma->XferHalfCpltCallback(hdma); - } - } - } - } - /* Transfer Complete Interrupt management ***********************************/ - if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) - { - if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) - { - /* Clear the transfer complete flag */ - regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; - - if(HAL_DMA_STATE_ABORT == hdma->State) - { - /* Disable all the transfer interrupts */ - hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); - hdma->Instance->FCR &= ~(DMA_IT_FE); - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR &= ~(DMA_IT_HT); - } - - /* Clear all interrupt flags at correct offset within the register */ - regs->IFCR = 0x3FU << hdma->StreamIndex; - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - if(hdma->XferAbortCallback != NULL) - { - hdma->XferAbortCallback(hdma); - } - return; - } - - if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) - { - /* Current memory buffer used is Memory 0 */ - if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) - { - if(hdma->XferM1CpltCallback != NULL) - { - /* Transfer complete Callback for memory1 */ - hdma->XferM1CpltCallback(hdma); - } - } - /* Current memory buffer used is Memory 1 */ - else - { - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete Callback for memory0 */ - hdma->XferCpltCallback(hdma); - } - } - } - /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ - else - { - if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) - { - /* Disable the transfer complete interrupt */ - hdma->Instance->CR &= ~(DMA_IT_TC); - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - } - - if(hdma->XferCpltCallback != NULL) - { - /* Transfer complete callback */ - hdma->XferCpltCallback(hdma); - } - } - } - } - - /* manage error case */ - if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) - { - if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) - { - hdma->State = HAL_DMA_STATE_ABORT; - - /* Disable the stream */ - __HAL_DMA_DISABLE(hdma); - - do - { - if (++count > timeout) - { - break; - } - } - while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); - - /* Process Unlocked */ - __HAL_UNLOCK(hdma); - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - } - - if(hdma->XferErrorCallback != NULL) - { - /* Transfer error callback */ - hdma->XferErrorCallback(hdma); - } - } -} - -/** - * @brief Register callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifer - * a DMA_HandleTypeDef structure as parameter. - * @param pCallback pointer to private callbacsk function which has pointer to - * a DMA_HandleTypeDef structure as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) -{ - - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = pCallback; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = pCallback; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = pCallback; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = pCallback; - break; - - default: - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @brief UnRegister callbacks - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param CallbackID User Callback identifer - * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - switch (CallbackID) - { - case HAL_DMA_XFER_CPLT_CB_ID: - hdma->XferCpltCallback = NULL; - break; - - case HAL_DMA_XFER_HALFCPLT_CB_ID: - hdma->XferHalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1CPLT_CB_ID: - hdma->XferM1CpltCallback = NULL; - break; - - case HAL_DMA_XFER_M1HALFCPLT_CB_ID: - hdma->XferM1HalfCpltCallback = NULL; - break; - - case HAL_DMA_XFER_ERROR_CB_ID: - hdma->XferErrorCallback = NULL; - break; - - case HAL_DMA_XFER_ABORT_CB_ID: - hdma->XferAbortCallback = NULL; - break; - - case HAL_DMA_XFER_ALL_CB_ID: - hdma->XferCpltCallback = NULL; - hdma->XferHalfCpltCallback = NULL; - hdma->XferM1CpltCallback = NULL; - hdma->XferM1HalfCpltCallback = NULL; - hdma->XferErrorCallback = NULL; - hdma->XferAbortCallback = NULL; - break; - - default: - status = HAL_ERROR; - break; - } - } - else - { - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(hdma); - - return status; -} - -/** - * @} - */ - -/** @addtogroup DMA_Exported_Functions_Group3 - * -@verbatim - =============================================================================== - ##### State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DMA state - (+) Get error code - -@endverbatim - * @{ - */ - -/** - * @brief Returns the DMA state. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL state - */ -HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) -{ - return hdma->State; -} - -/** - * @brief Return the DMA error code - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval DMA Error Code - */ -uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) -{ - return hdma->ErrorCode; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Sets the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Clear DBM bit */ - hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); - - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Memory to Peripheral */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Peripheral to Memory */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @brief Returns the DMA Stream base address depending on stream number - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval Stream base address - */ -static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) -{ - uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; - - /* lookup table for necessary bitshift of flags within status registers */ - static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; - hdma->StreamIndex = flagBitshiftOffset[stream_number]; - - if (stream_number > 3U) - { - /* return pointer to HISR and HIFCR */ - hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); - } - else - { - /* return pointer to LISR and LIFCR */ - hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); - } - - return hdma->StreamBaseAddress; -} - -/** - * @brief Check compatibility between FIFO threshold level and size of the memory burst - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval HAL status - */ -static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) -{ - HAL_StatusTypeDef status = HAL_OK; - uint32_t tmp = hdma->Init.FIFOThreshold; - - /* Memory Data size equal to Byte */ - if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; - } - } - - /* Memory Data size equal to Half-Word */ - else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - /* Memory Data size equal to Word */ - else - { - switch (tmp) - { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; - } - } - - return status; -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma.c + * @author MCD Application Team + * @brief DMA HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the Direct Memory Access (DMA) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State and errors functions + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable and configure the peripheral to be connected to the DMA Stream + (except for internal SRAM/FLASH memories: no initialization is + necessary) please refer to Reference manual for connection between peripherals + and DMA requests. + + (#) For a given Stream, program the required configuration through the following parameters: + Transfer Direction, Source and Destination data formats, + Circular, Normal or peripheral flow control mode, Stream Priority level, + Source and Destination Increment mode, FIFO mode and its Threshold (if needed), + Burst mode for Source and/or Destination (if needed) using HAL_DMA_Init() function. + + -@- Prior to HAL_DMA_Init() the clock must be enabled for DMA through the following macros: + __HAL_RCC_DMA1_CLK_ENABLE() or __HAL_RCC_DMA2_CLK_ENABLE(). + + *** Polling mode IO operation *** + ================================= + [..] + (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source + address and destination address and the Length of data to be transferred. + (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this + case a fixed Timeout can be configured by User depending from his application. + (+) Use HAL_DMA_Abort() function to abort the current transfer. + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() + (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() + (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of + Source address and destination address and the Length of data to be transferred. In this + case the DMA interrupt is configured + (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine + (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can + add his own function by customization of function pointer XferCpltCallback and + XferErrorCallback (i.e a member of DMA handle structure). + [..] + (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error + detection. + + (#) Use HAL_DMA_Abort_IT() function to abort the current transfer + + -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. + + -@- The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is + possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set + Half-Word data size for the peripheral to access its data register and set Word data size + for the Memory to gain in access time. Each two half words will be packed and written in + a single access to a Word in the Memory). + + -@- When FIFO is disabled, it is not allowed to configure different Data Sizes for Source + and Destination. In this case the Peripheral Data Size will be applied to both Source + and Destination. + + *** DMA HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in DMA HAL driver. + + (+) __HAL_DMA_ENABLE: Enable the specified DMA Stream. + (+) __HAL_DMA_DISABLE: Disable the specified DMA Stream. + (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Stream interrupt has occurred or not. + + [..] + (@) You can refer to the DMA HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + __IO uint32_t ISR; /*!< DMA interrupt status register */ + __IO uint32_t Reserved0; + __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ +} DMA_Base_Registers; + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Constants + * @{ + */ + #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Functions + * @{ + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize the DMA Stream source + and destination addresses, incrementation and data sizes, transfer direction, + circular/normal mode selection, memory-to-memory mode selection and Stream priority value. + [..] + The HAL_DMA_Init() function follows the DMA configuration procedures as described in + reference manual. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the DMA according to the specified + * parameters in the DMA_InitTypeDef and create the associated handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + uint32_t tickstart = HAL_GetTick(); + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); + assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); + /* Check the memory burst, peripheral burst and FIFO threshold parameters only + when FIFO mode is enabled */ + if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) + { + assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); + assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); + assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); + } + + /* Allocate lock resource */ + __HAL_UNLOCK(hdma); + + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Get the CR register value */ + tmp = hdma->Instance->CR; + + /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ + tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ + DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ + DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ + DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); + + /* Prepare the DMA Stream configuration */ + tmp |= hdma->Init.Channel | hdma->Init.Direction | + hdma->Init.PeriphInc | hdma->Init.MemInc | + hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + hdma->Init.Mode | hdma->Init.Priority; + + /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get memory burst and peripheral burst */ + tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; + } + + /* Write to DMA Stream CR register */ + hdma->Instance->CR = tmp; + + /* Get the FCR register value */ + tmp = hdma->Instance->FCR; + + /* Clear Direct mode and FIFO threshold bits */ + tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); + + /* Prepare the DMA Stream FIFO configuration */ + tmp |= hdma->Init.FIFOMode; + + /* The FIFO threshold is not used when the FIFO mode is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get the FIFO threshold */ + tmp |= hdma->Init.FIFOThreshold; + + /* Check compatibility between FIFO threshold level and size of the memory burst */ + /* for INCR4, INCR8, INCR16 bursts */ + if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) + { + if (DMA_CheckFifoParam(hdma) != HAL_OK) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_ERROR; + } + } + } + + /* Write to DMA Stream FCR */ + hdma->Instance->FCR = tmp; + + /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate + DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clear all interrupt flags */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the DMA peripheral + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the DMA peripheral state */ + if(hdma->State == HAL_DMA_STATE_BUSY) + { + /* Return error status */ + return HAL_BUSY; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + + /* Disable the selected DMA Streamx */ + __HAL_DMA_DISABLE(hdma); + + /* Reset DMA Streamx control register */ + hdma->Instance->CR = 0U; + + /* Reset DMA Streamx number of data to transfer register */ + hdma->Instance->NDTR = 0U; + + /* Reset DMA Streamx peripheral address register */ + hdma->Instance->PAR = 0U; + + /* Reset DMA Streamx memory 0 address register */ + hdma->Instance->M0AR = 0U; + + /* Reset DMA Streamx memory 1 address register */ + hdma->Instance->M1AR = 0U; + + /* Reset DMA Streamx FIFO control register */ + hdma->Instance->FCR = 0x00000021U; + + /* Get DMA steam Base Address */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clean all callbacks */ + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Reset the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Reset the DMA state */ + hdma->State = HAL_DMA_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group2 + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and Start DMA transfer + (+) Configure the source, destination address and data length and + Start DMA transfer with interrupt + (+) Abort DMA transfer + (+) Poll for transfer complete + (+) Handle DMA interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Starts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Start the DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + + if(hdma->XferHalfCpltCallback != NULL) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + + return status; +} + +/** + * @brief Aborts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * + * @note After disabling a DMA Stream, a check for wait until the DMA Stream is + * effectively disabled is added. If a Stream is disabled + * while a data transfer is ongoing, the current data will be transferred + * and the Stream will be effectively disabled only after the transfer of + * this single data is finished. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + uint32_t tickstart = HAL_GetTick(); + + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + else + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + } + return HAL_OK; +} + +/** + * @brief Aborts the DMA Transfer in Interrupt mode. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) +{ + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + return HAL_ERROR; + } + else + { + /* Set Abort State */ + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + } + + return HAL_OK; +} + +/** + * @brief Polling for transfer complete. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CompleteLevel Specifies the DMA level complete. + * @note The polling mode is kept in this version for legacy. it is recommanded to use the IT model instead. + * This model could be used for debug purpose. + * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t mask_cpltlevel; + uint32_t tickstart = HAL_GetTick(); + uint32_t tmpisr; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* No transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + __HAL_UNLOCK(hdma); + return HAL_ERROR; + } + + /* Polling mode not supported in circular mode and double buffering mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + } + else + { + /* Half Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + } + + regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + tmpisr = regs->ISR; + + while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) + { + /* Check for the Timeout (Not applicable in circular mode)*/ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_TIMEOUT; + } + } + + /* Get the ISR register value */ + tmpisr = regs->ISR; + + if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + + /* Clear the Direct Mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + } + } + + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + HAL_DMA_Abort(hdma); + + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State= HAL_DMA_STATE_READY; + + return HAL_ERROR; + } + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + hdma->State = HAL_DMA_STATE_READY; + } + else + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; + } + + return status; +} + +/** + * @brief Handles DMA interrupt request. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval None + */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + uint32_t tmpisr; + __IO uint32_t count = 0U; + uint32_t timeout = SystemCoreClock / 9600U; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + tmpisr = regs->ISR; + + /* Transfer Error Interrupt management ***************************************/ + if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) + { + /* Disable the transfer error interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TE); + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + } + } + /* FIFO Error Interrupt management ******************************************/ + if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) + { + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + } + } + /* Direct Mode Error Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) + { + /* Clear the direct mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + } + } + /* Half Transfer Complete Interrupt management ******************************/ + if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) + { + /* Clear the half transfer complete flag */ + regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + + /* Multi_Buffering mode enabled */ + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferM1HalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferM1HalfCpltCallback(hdma); + } + } + } + else + { + /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the half transfer interrupt */ + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + } + } + /* Transfer Complete Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) + { + /* Clear the transfer complete flag */ + regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + + if(HAL_DMA_STATE_ABORT == hdma->State) + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + if(hdma->XferAbortCallback != NULL) + { + hdma->XferAbortCallback(hdma); + } + return; + } + + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferM1CpltCallback != NULL) + { + /* Transfer complete Callback for memory1 */ + hdma->XferM1CpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete Callback for memory0 */ + hdma->XferCpltCallback(hdma); + } + } + } + /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ + else + { + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the transfer complete interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TC); + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete callback */ + hdma->XferCpltCallback(hdma); + } + } + } + } + + /* manage error case */ + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + do + { + if (++count > timeout) + { + break; + } + } + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + + if(hdma->XferErrorCallback != NULL) + { + /* Transfer error callback */ + hdma->XferErrorCallback(hdma); + } + } +} + +/** + * @brief Register callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a DMA_HandleTypeDef structure as parameter. + * @param pCallback pointer to private callbacsk function which has pointer to + * a DMA_HandleTypeDef structure as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) +{ + + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = pCallback; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = pCallback; + break; + + default: + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @brief UnRegister callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = NULL; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = NULL; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = NULL; + break; + + case HAL_DMA_XFER_ALL_CB_ID: + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group3 + * +@verbatim + =============================================================================== + ##### State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Check the DMA state + (+) Get error code + +@endverbatim + * @{ + */ + +/** + * @brief Returns the DMA state. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL state + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) +{ + return hdma->State; +} + +/** + * @brief Return the DMA error code + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval DMA Error Code + */ +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) +{ + return hdma->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Sets the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Clear DBM bit */ + hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); + + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Memory to Peripheral */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Peripheral to Memory */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @brief Returns the DMA Stream base address depending on stream number + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval Stream base address + */ +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) +{ + uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; + + /* lookup table for necessary bitshift of flags within status registers */ + static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; + hdma->StreamIndex = flagBitshiftOffset[stream_number]; + + if (stream_number > 3U) + { + /* return pointer to HISR and HIFCR */ + hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); + } + else + { + /* return pointer to LISR and LIFCR */ + hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); + } + + return hdma->StreamBaseAddress; +} + +/** + * @brief Check compatibility between FIFO threshold level and size of the memory burst + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmp = hdma->Init.FIFOThreshold; + + /* Memory Data size equal to Byte */ + if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + break; + default: + break; + } + } + + /* Memory Data size equal to Half-Word */ + else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + /* Memory Data size equal to Word */ + else + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_HALFFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_FULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + return status; +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c index bfcc1fd0..6e073768 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c @@ -1,315 +1,315 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_dma_ex.c - * @author MCD Application Team - * @brief DMA Extension HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the DMA Extension peripheral: - * + Extended features functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The DMA Extension HAL driver can be used as follows: - (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function - for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. - - -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. - -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. - -@- In Multi (Double) buffer mode, it is possible to update the base address for - the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup DMAEx DMAEx - * @brief DMA Extended HAL module driver - * @{ - */ - -#ifdef HAL_DMA_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private Constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup DMAEx_Private_Functions - * @{ - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ - -/** @addtogroup DMAEx_Exported_Functions - * @{ - */ - - -/** @addtogroup DMAEx_Exported_Functions_Group1 - * -@verbatim - =============================================================================== - ##### Extended features functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer - (+) Configure the source, destination address and data length and - Start MultiBuffer DMA transfer with interrupt - (+) Change on the fly the memory0 or memory1 address. - -@endverbatim - * @{ - */ - - -/** - * @brief Starts the multi_buffer DMA Transfer. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - status = HAL_ERROR; - } - else - { - /* Process Locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Enable the double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Return error status */ - status = HAL_BUSY; - } - } - return status; -} - -/** - * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DMA_BUFFER_SIZE(DataLength)); - - /* Memory-to-memory transfer not supported in double buffering mode */ - if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) - { - hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; - return HAL_ERROR; - } - - /* Check callback functions */ - if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) - { - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - return HAL_ERROR; - } - - /* Process locked */ - __HAL_LOCK(hdma); - - if(HAL_DMA_STATE_READY == hdma->State) - { - /* Change DMA peripheral state */ - hdma->State = HAL_DMA_STATE_BUSY; - - /* Initialize the error code */ - hdma->ErrorCode = HAL_DMA_ERROR_NONE; - - /* Enable the Double buffer mode */ - hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; - - /* Configure DMA Stream destination address */ - hdma->Instance->M1AR = SecondMemAddress; - - /* Configure the source, destination address and the data length */ - DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); - - /* Clear all flags */ - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); - __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); - - /* Enable Common interrupts*/ - hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; - hdma->Instance->FCR |= DMA_IT_FE; - - if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) - { - hdma->Instance->CR |= DMA_IT_HT; - } - - /* Enable the peripheral */ - __HAL_DMA_ENABLE(hdma); - } - else - { - /* Process unlocked */ - __HAL_UNLOCK(hdma); - - /* Return error status */ - status = HAL_BUSY; - } - return status; -} - -/** - * @brief Change the memory0 or memory1 address on the fly. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param Address The new address - * @param memory the memory to be changed, This parameter can be one of - * the following values: - * MEMORY0 / - * MEMORY1 - * @note The MEMORY0 address can be changed only when the current transfer use - * MEMORY1 and the MEMORY1 address can be changed only when the current - * transfer use MEMORY0. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) -{ - if(memory == MEMORY0) - { - /* change the memory0 address */ - hdma->Instance->M0AR = Address; - } - else - { - /* change the memory1 address */ - hdma->Instance->M1AR = Address; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup DMAEx_Private_Functions - * @{ - */ - -/** - * @brief Set the DMA Transfer parameter. - * @param hdma pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @param SrcAddress The source memory Buffer address - * @param DstAddress The destination memory Buffer address - * @param DataLength The length of data to be transferred from source to destination - * @retval HAL status - */ -static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) -{ - /* Configure DMA Stream data length */ - hdma->Instance->NDTR = DataLength; - - /* Peripheral to Memory */ - if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) - { - /* Configure DMA Stream destination address */ - hdma->Instance->PAR = DstAddress; - - /* Configure DMA Stream source address */ - hdma->Instance->M0AR = SrcAddress; - } - /* Memory to Peripheral */ - else - { - /* Configure DMA Stream source address */ - hdma->Instance->PAR = SrcAddress; - - /* Configure DMA Stream destination address */ - hdma->Instance->M0AR = DstAddress; - } -} - -/** - * @} - */ - -#endif /* HAL_DMA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.c + * @author MCD Application Team + * @brief DMA Extension HAL module driver + * This file provides firmware functions to manage the following + * functionalities of the DMA Extension peripheral: + * + Extended features functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The DMA Extension HAL driver can be used as follows: + (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function + for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. + + -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. + -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. + -@- In Multi (Double) buffer mode, it is possible to update the base address for + the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMAEx DMAEx + * @brief DMA Extended HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private Constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMAEx_Private_Functions + * @{ + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ + +/** @addtogroup DMAEx_Exported_Functions + * @{ + */ + + +/** @addtogroup DMAEx_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer with interrupt + (+) Change on the fly the memory0 or memory1 address. + +@endverbatim + * @{ + */ + + +/** + * @brief Starts the multi_buffer DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + status = HAL_ERROR; + } + else + { + /* Process Locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Enable the double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Return error status */ + status = HAL_BUSY; + } + } + return status; +} + +/** + * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Check callback functions */ + if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) + { + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Enable the Double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all flags */ + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + hdma->Instance->FCR |= DMA_IT_FE; + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Change the memory0 or memory1 address on the fly. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param Address The new address + * @param memory the memory to be changed, This parameter can be one of + * the following values: + * MEMORY0 / + * MEMORY1 + * @note The MEMORY0 address can be changed only when the current transfer use + * MEMORY1 and the MEMORY1 address can be changed only when the current + * transfer use MEMORY0. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) +{ + if(memory == MEMORY0) + { + /* change the memory0 address */ + hdma->Instance->M0AR = Address; + } + else + { + /* change the memory1 address */ + hdma->Instance->M1AR = Address; + } + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMAEx_Private_Functions + * @{ + */ + +/** + * @brief Set the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Peripheral to Memory */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Memory to Peripheral */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c index 6bed5d54..7cf3e092 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c @@ -1,559 +1,559 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_exti.c - * @author MCD Application Team - * @brief EXTI HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - @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_GetConfigLine(). - (++) 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_GetPending(). - - (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2018 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ -/** MISRA C:2012 deviation rule has been granted for following rule: - * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out - * of bounds [0,3] in following API : - * HAL_EXTI_SetConfigLine - * HAL_EXTI_GetConfigLine - * HAL_EXTI_ClearConfigLine - */ - -#ifdef HAL_EXTI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/** @defgroup EXTI_Private_Constants EXTI Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup EXTI_Exported_Functions - * @{ - */ - -/** @addtogroup EXTI_Exported_Functions_Group1 - * @brief Configuration functions - * -@verbatim - =============================================================================== - ##### Configuration functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Set configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on EXTI configuration to be set. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check parameters */ - assert_param(IS_EXTI_LINE(pExtiConfig->Line)); - assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - - /* Assign line number to handle */ - hexti->Line = pExtiConfig->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* Configure triggers for configurable lines */ - if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) - { - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - - /* Configure rising trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) - { - EXTI->RTSR |= maskline; - } - else - { - EXTI->RTSR &= ~maskline; - } - - /* Configure falling trigger */ - /* Mask or set line */ - if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) - { - EXTI->FTSR |= maskline; - } - else - { - EXTI->FTSR &= ~maskline; - } - - - /* Configure gpio port selection in case of gpio exti line */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - /* Configure interrupt mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) - { - EXTI->IMR |= maskline; - } - else - { - EXTI->IMR &= ~maskline; - } - - /* Configure event mode : read current mode */ - /* Mask or set line */ - if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) - { - EXTI->EMR |= maskline; - } - else - { - EXTI->EMR &= ~maskline; - } - - return HAL_OK; -} - -/** - * @brief Get configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @param pExtiConfig Pointer on structure to store Exti configuration. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if ((hexti == NULL) || (pExtiConfig == NULL)) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* Store handle line number to configuration structure */ - pExtiConfig->Line = hexti->Line; - - /* Compute line mask */ - linepos = (pExtiConfig->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Get core mode : interrupt */ - - /* Check if selected line is enable */ - if ((EXTI->IMR & maskline) != 0x00u) - { - pExtiConfig->Mode = EXTI_MODE_INTERRUPT; - } - else - { - pExtiConfig->Mode = EXTI_MODE_NONE; - } - - /* Get event mode */ - /* Check if selected line is enable */ - if ((EXTI->EMR & maskline) != 0x00u) - { - pExtiConfig->Mode |= EXTI_MODE_EVENT; - } - - /* 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; - } - else - { - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - } - - /* Get falling configuration */ - /* Check if configuration of selected line is enable */ - if ((EXTI->FTSR & maskline) != 0x00u) - { - pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; - } - - /* Get Gpio port selection for gpio lines */ - if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); - } - else - { - pExtiConfig->GPIOSel = 0x00u; - } - } - else - { - /* No Trigger selected */ - pExtiConfig->Trigger = EXTI_TRIGGER_NONE; - pExtiConfig->GPIOSel = 0x00u; - } - - return HAL_OK; -} - -/** - * @brief Clear whole configuration of a dedicated Exti line. - * @param hexti Exti handle. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - - /* Check the parameter */ - assert_param(IS_EXTI_LINE(hexti->Line)); - - /* compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~maskline); - - /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~maskline); - - /* 3] Clear triggers in case of configurable lines */ - if ((hexti->Line & EXTI_CONFIG) != 0x00u) - { - EXTI->RTSR = (EXTI->RTSR & ~maskline); - EXTI->FTSR = (EXTI->FTSR & ~maskline); - - /* Get Gpio port selection for gpio lines */ - if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) - { - assert_param(IS_EXTI_GPIO_PIN(linepos)); - - regval = SYSCFG->EXTICR[linepos >> 2u]; - regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); - SYSCFG->EXTICR[linepos >> 2u] = regval; - } - } - - return HAL_OK; -} - -/** - * @brief Register callback for a dedicated Exti line. - * @param hexti Exti handle. - * @param CallbackID User callback identifier. - * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. - * @param pPendingCbfn function pointer to be stored as callback. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) -{ - HAL_StatusTypeDef status = HAL_OK; - - switch (CallbackID) - { - case HAL_EXTI_COMMON_CB_ID: - hexti->PendingCallback = pPendingCbfn; - break; - - default: - status = HAL_ERROR; - break; - } - - return status; -} - -/** - * @brief Store line number as handle private field. - * @param hexti Exti handle. - * @param ExtiLine Exti line number. - * This parameter can be from 0 to @ref EXTI_LINE_NB. - * @retval HAL Status. - */ -HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(ExtiLine)); - - /* Check null pointer */ - if (hexti == NULL) - { - return HAL_ERROR; - } - else - { - /* Store line number as handle private field */ - hexti->Line = ExtiLine; - - return HAL_OK; - } -} - -/** - * @} - */ - -/** @addtogroup EXTI_Exported_Functions_Group2 - * @brief EXTI IO functions. - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Handle EXTI interrupt request. - * @param hexti Exti handle. - * @retval none. - */ -void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) -{ - uint32_t regval; - uint32_t maskline; - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Get pending bit */ - regval = (EXTI->PR & maskline); - if (regval != 0x00u) - { - /* Clear pending bit */ - EXTI->PR = maskline; - - /* Call callback */ - if (hexti->PendingCallback != NULL) - { - hexti->PendingCallback(); - } - } -} - -/** - * @brief Get interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be checked. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval 1 if interrupt is pending else 0. - */ -uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t regval; - uint32_t linepos; - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - linepos = (hexti->Line & EXTI_PIN_MASK); - maskline = (1uL << linepos); - - /* return 1 if bit is set else 0 */ - regval = ((EXTI->PR & maskline) >> linepos); - return regval; -} - -/** - * @brief Clear interrupt pending bit of a dedicated line. - * @param hexti Exti handle. - * @param Edge Specify which pending edge as to be clear. - * This parameter can be one of the following values: - * @arg @ref EXTI_TRIGGER_RISING_FALLING - * This parameter is kept for compatibility with other series. - * @retval None. - */ -void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - assert_param(IS_EXTI_PENDING_EDGE(Edge)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Clear Pending bit */ - EXTI->PR = maskline; -} - -/** - * @brief Generate a software interrupt for a dedicated line. - * @param hexti Exti handle. - * @retval None. - */ -void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) -{ - uint32_t maskline; - - /* Check parameters */ - assert_param(IS_EXTI_LINE(hexti->Line)); - assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - - /* Compute line mask */ - maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); - - /* Generate Software interrupt */ - EXTI->SWIER = maskline; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_EXTI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.c + * @author MCD Application Team + * @brief EXTI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @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_GetConfigLine(). + (++) 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_GetPending(). + + (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ +/** MISRA C:2012 deviation rule has been granted for following rule: + * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out + * of bounds [0,3] in following API : + * HAL_EXTI_SetConfigLine + * HAL_EXTI_GetConfigLine + * HAL_EXTI_ClearConfigLine + */ + +#ifdef HAL_EXTI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup EXTI_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_Exported_Functions_Group1 + * @brief Configuration functions + * +@verbatim + =============================================================================== + ##### Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Set configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on EXTI configuration to be set. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check parameters */ + assert_param(IS_EXTI_LINE(pExtiConfig->Line)); + assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); + + /* Assign line number to handle */ + hexti->Line = pExtiConfig->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; + } + else + { + EXTI->IMR &= ~maskline; + } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + + return HAL_OK; +} + +/** + * @brief Get configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on structure to store Exti configuration. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* Store handle line number to configuration structure */ + pExtiConfig->Line = hexti->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) + { + pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + } + else + { + pExtiConfig->Mode = EXTI_MODE_NONE; + } + + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) + { + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 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; + } + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } + } + else + { + /* No Trigger selected */ + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; + } + + return HAL_OK; +} + +/** + * @brief Clear whole configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Clear interrupt mode */ + EXTI->IMR = (EXTI->IMR & ~maskline); + + /* 2] Clear event mode */ + EXTI->EMR = (EXTI->EMR & ~maskline); + + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + return HAL_OK; +} + +/** + * @brief Register callback for a dedicated Exti line. + * @param hexti Exti handle. + * @param CallbackID User callback identifier. + * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. + * @param pPendingCbfn function pointer to be stored as callback. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) +{ + HAL_StatusTypeDef status = HAL_OK; + + switch (CallbackID) + { + case HAL_EXTI_COMMON_CB_ID: + hexti->PendingCallback = pPendingCbfn; + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Store line number as handle private field. + * @param hexti Exti handle. + * @param ExtiLine Exti line number. + * This parameter can be from 0 to @ref EXTI_LINE_NB. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(ExtiLine)); + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + else + { + /* Store line number as handle private field */ + hexti->Line = ExtiLine; + + return HAL_OK; + } +} + +/** + * @} + */ + +/** @addtogroup EXTI_Exported_Functions_Group2 + * @brief EXTI IO functions. + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Handle EXTI interrupt request. + * @param hexti Exti handle. + * @retval none. + */ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Get pending bit */ + regval = (EXTI->PR & maskline); + if (regval != 0x00u) + { + /* Clear pending bit */ + EXTI->PR = maskline; + + /* Call callback */ + if (hexti->PendingCallback != NULL) + { + hexti->PendingCallback(); + } + } +} + +/** + * @brief Get interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be checked. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval 1 if interrupt is pending else 0. + */ +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* return 1 if bit is set else 0 */ + regval = ((EXTI->PR & maskline) >> linepos); + return regval; +} + +/** + * @brief Clear interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be clear. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval None. + */ +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Clear Pending bit */ + EXTI->PR = maskline; +} + +/** + * @brief Generate a software interrupt for a dedicated line. + * @param hexti Exti handle. + * @retval None. + */ +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) +{ + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_EXTI_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c index 28f651fe..69b47a6e 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c @@ -1,778 +1,778 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash.c - * @author MCD Application Team - * @brief FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the internal FLASH memory: - * + Program operations functions - * + Memory Control functions - * + Peripheral Errors functions - * - @verbatim - ============================================================================== - ##### FLASH peripheral features ##### - ============================================================================== - - [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses - to the Flash memory. It implements the erase and program Flash memory operations - and the read and write protection mechanisms. - - [..] The Flash memory interface accelerates code execution with a system of instruction - prefetch and cache lines. - - [..] The FLASH main features are: - (+) Flash memory read operations - (+) Flash memory program/erase operations - (+) Read / write protections - (+) Prefetch on I-Code - (+) 64 cache lines of 128 bits on I-Code - (+) 8 cache lines of 128 bits on D-Code - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver provides functions and macros to configure and program the FLASH - memory of all STM32F4xx devices. - - (#) FLASH Memory IO Programming functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Program functions: byte, half word, word and double word - (++) There Two modes of programming : - (+++) Polling mode using HAL_FLASH_Program() function - (+++) Interrupt mode using HAL_FLASH_Program_IT() function - - (#) Interrupts and flags management functions : - (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() - (++) Wait for last FLASH operation according to its status - (++) Get error flag status by calling HAL_SetErrorCode() - - [..] - In addition to these functions, this driver includes a set of macros allowing - to handle the following operations: - (+) Set the latency - (+) Enable/Disable the prefetch buffer - (+) Enable/Disable the Instruction cache and the Data cache - (+) Reset the Instruction cache and the Data cache - (+) Enable/Disable the FLASH interrupts - (+) Monitor the FLASH flags status - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH FLASH - * @brief FLASH HAL module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASH_Private_Variables - * @{ - */ -/* Variable used for Erase sectors under interruption */ -FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASH_Private_Functions - * @{ - */ -/* Program operations */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); -static void FLASH_Program_Word(uint32_t Address, uint32_t Data); -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); -static void FLASH_SetErrorCode(void); - -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_Exported_Functions FLASH Exported Functions - * @{ - */ - -/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions - * @brief Programming operation functions - * -@verbatim - =============================================================================== - ##### Programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the FLASH - program operations. - -@endverbatim - * @{ - */ - -/** - * @brief Program byte, halfword, word or double word at a specified address - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL_StatusTypeDef HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. - * @param TypeProgram Indicate the way to program at a specified address. - * This parameter can be a value of @ref FLASH_Type_Program - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; - pFlash.Address = Address; - - if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) - { - /*Program byte (8-bit) at a specified address.*/ - FLASH_Program_Byte(Address, (uint8_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) - { - /*Program halfword (16-bit) at a specified address.*/ - FLASH_Program_HalfWord(Address, (uint16_t) Data); - } - else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) - { - /*Program word (32-bit) at a specified address.*/ - FLASH_Program_Word(Address, (uint32_t) Data); - } - else - { - /*Program double word (64-bit) at a specified address.*/ - FLASH_Program_DoubleWord(Address, Data); - } - - return status; -} - -/** - * @brief This function handles FLASH interrupt request. - * @retval None - */ -void HAL_FLASH_IRQHandler(void) -{ - uint32_t addresstmp = 0U; - - /* Check FLASH operation error flags */ -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*return the faulty sector*/ - addresstmp = pFlash.Sector; - pFlash.Sector = 0xFFFFFFFFU; - } - else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /*return the faulty bank*/ - addresstmp = pFlash.Bank; - } - else - { - /*return the faulty address*/ - addresstmp = pFlash.Address; - } - - /*Save the Error code*/ - FLASH_SetErrorCode(); - - /* FLASH error interrupt user callback */ - HAL_FLASH_OperationErrorCallback(addresstmp); - - /*Stop the procedure ongoing*/ - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - - /* Check FLASH End of Operation flag */ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - - if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) - { - /*Nb of sector to erased can be decreased*/ - pFlash.NbSectorsToErase--; - - /* Check if there are still sectors to erase*/ - if(pFlash.NbSectorsToErase != 0U) - { - addresstmp = pFlash.Sector; - /*Indicate user which sector has been erased*/ - HAL_FLASH_EndOfOperationCallback(addresstmp); - - /*Increment sector number*/ - pFlash.Sector++; - addresstmp = pFlash.Sector; - FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); - } - else - { - /*No more sectors to Erase, user callback can be called.*/ - /*Reset Sector and stop Erase sectors procedure*/ - pFlash.Sector = addresstmp = 0xFFFFFFFFU; - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches() ; - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(addresstmp); - } - } - else - { - if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) - { - /* MassErase ended. Return the selected bank */ - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches() ; - - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Bank); - } - else - { - /*Program ended. Return the selected address*/ - /* FLASH EOP interrupt user callback */ - HAL_FLASH_EndOfOperationCallback(pFlash.Address); - } - pFlash.ProcedureOnGoing = FLASH_PROC_NONE; - } - } - - if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) - { - /* Operation is completed, disable the PG, SER, SNB and MER Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); - - /* Disable End of FLASH Operation interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); - - /* Disable Error source interrupt */ - __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - } -} - -/** - * @brief FLASH end of operation interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector which has been erased - * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_EndOfOperationCallback could be implemented in the user file - */ -} - -/** - * @brief FLASH operation error interrupt callback - * @param ReturnValue The value saved in this parameter depends on the ongoing procedure - * Mass Erase: Bank number which has been requested to erase - * Sectors Erase: Sector number which returned an error - * Program: Address which was selected for data program - * @retval None - */ -__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(ReturnValue); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_FLASH_OperationErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the FLASH - memory operations. - -@endverbatim - * @{ - */ - -/** - * @brief Unlock the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Unlock(void) -{ - HAL_StatusTypeDef status = HAL_OK; - - if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - WRITE_REG(FLASH->KEYR, FLASH_KEY1); - WRITE_REG(FLASH->KEYR, FLASH_KEY2); - - /* Verify Flash is unlocked */ - if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) - { - status = HAL_ERROR; - } - } - - return status; -} - -/** - * @brief Locks the FLASH control register access - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; - - return HAL_OK; -} - -/** - * @brief Unlock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) -{ - if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief Lock the FLASH Option Control Registers access. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; - - return HAL_OK; -} - -/** - * @brief Launch the option byte loading. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) -{ - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); -} - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time Errors of the FLASH peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Get the specific FLASH error flag. - * @retval FLASH_ErrorCode: The returned value can be a combination of: - * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) - * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag - * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag - * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag - * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag - * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag - */ -uint32_t HAL_FLASH_GetError(void) -{ - return pFlash.ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Wait for a FLASH operation to complete. - * @param Timeout maximum flash operationtimeout - * @retval HAL Status - */ -HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) -{ - uint32_t tickstart = 0U; - - /* Clear Error Code */ - pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - /* Check FLASH End of Operation flag */ - if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) - { - /* Clear FLASH End of Operation pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); - } -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) -#else - if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ - FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) -#endif /* FLASH_SR_RDERR */ - { - /*Save the error code*/ - FLASH_SetErrorCode(); - return HAL_ERROR; - } - - /* If there is no error flag set */ - return HAL_OK; - -} - -/** - * @brief Program a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and Vpp in the range 7V to 9V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - /* Program first word */ - *(__IO uint32_t*)Address = (uint32_t)Data; - - /* Barrier to ensure programming is performed in 2 steps, in right order - (independently of compiler optimization behavior) */ - __ISB(); - - /* Program second word */ - *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); -} - - -/** - * @brief Program word (32-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Word(uint32_t Address, uint32_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t*)Address = Data; -} - -/** - * @brief Program a half-word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.1V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t*)Address = Data; -} - -/** - * @brief Program byte (8-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 1.8V to 3.6V. - * - * @note If an erase and a program operations are requested simultaneously, - * the erase operation is performed before the program one. - * - * @param Address specifies the address to be programmed. - * @param Data specifies the data to be programmed. - * @retval None - */ -static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* If the previous operation is completed, proceed to program the new data */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t*)Address = Data; -} - -/** - * @brief Set the specific FLASH error flag. - * @retval None - */ -static void FLASH_SetErrorCode(void) -{ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; - - /* Clear FLASH write protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; - - /* Clear FLASH Programming alignment error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; - - /* Clear FLASH Programming parallelism error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); - } - - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; - - /* Clear FLASH Programming sequence error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); - } -#if defined(FLASH_SR_RDERR) - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; - - /* Clear FLASH Proprietary readout protection error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); - } -#endif /* FLASH_SR_RDERR */ - if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) - { - pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; - - /* Clear FLASH Operation error pending bit */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.c + * @author MCD Application Team + * @brief FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * + Program operations functions + * + Memory Control functions + * + Peripheral Errors functions + * + @verbatim + ============================================================================== + ##### FLASH peripheral features ##### + ============================================================================== + + [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + to the Flash memory. It implements the erase and program Flash memory operations + and the read and write protection mechanisms. + + [..] The Flash memory interface accelerates code execution with a system of instruction + prefetch and cache lines. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) 64 cache lines of 128 bits on I-Code + (+) 8 cache lines of 128 bits on D-Code + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F4xx devices. + + (#) FLASH Memory IO Programming functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Program functions: byte, half word, word and double word + (++) There Two modes of programming : + (+++) Polling mode using HAL_FLASH_Program() function + (+++) Interrupt mode using HAL_FLASH_Program_IT() function + + (#) Interrupts and flags management functions : + (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() + (++) Wait for last FLASH operation according to its status + (++) Get error flag status by calling HAL_SetErrorCode() + + [..] + In addition to these functions, this driver includes a set of macros allowing + to handle the following operations: + (+) Set the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the Instruction cache and the Data cache + (+) Reset the Instruction cache and the Data cache + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variable used for Erase sectors under interruption */ +FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASH_Private_Functions + * @{ + */ +/* Program operations */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); +static void FLASH_Program_Word(uint32_t Address, uint32_t Data); +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); +static void FLASH_SetErrorCode(void); + +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + * @brief Programming operation functions + * +@verbatim + =============================================================================== + ##### Programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the FLASH + program operations. + +@endverbatim + * @{ + */ + +/** + * @brief Program byte, halfword, word or double word at a specified address + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + FLASH->CR &= (~FLASH_CR_PG); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; + pFlash.Address = Address; + + if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + return status; +} + +/** + * @brief This function handles FLASH interrupt request. + * @retval None + */ +void HAL_FLASH_IRQHandler(void) +{ + uint32_t addresstmp = 0U; + + /* Check FLASH operation error flags */ +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*return the faulty sector*/ + addresstmp = pFlash.Sector; + pFlash.Sector = 0xFFFFFFFFU; + } + else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /*return the faulty bank*/ + addresstmp = pFlash.Bank; + } + else + { + /*return the faulty address*/ + addresstmp = pFlash.Address; + } + + /*Save the Error code*/ + FLASH_SetErrorCode(); + + /* FLASH error interrupt user callback */ + HAL_FLASH_OperationErrorCallback(addresstmp); + + /*Stop the procedure ongoing*/ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + + /* Check FLASH End of Operation flag */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + + if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*Nb of sector to erased can be decreased*/ + pFlash.NbSectorsToErase--; + + /* Check if there are still sectors to erase*/ + if(pFlash.NbSectorsToErase != 0U) + { + addresstmp = pFlash.Sector; + /*Indicate user which sector has been erased*/ + HAL_FLASH_EndOfOperationCallback(addresstmp); + + /*Increment sector number*/ + pFlash.Sector++; + addresstmp = pFlash.Sector; + FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); + } + else + { + /*No more sectors to Erase, user callback can be called.*/ + /*Reset Sector and stop Erase sectors procedure*/ + pFlash.Sector = addresstmp = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches() ; + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + } + } + else + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* MassErase ended. Return the selected bank */ + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches() ; + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Bank); + } + else + { + /*Program ended. Return the selected address*/ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + + if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + { + /* Operation is completed, disable the PG, SER, SNB and MER Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); + + /* Disable End of FLASH Operation interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); + + /* Disable Error source interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + } +} + +/** + * @brief FLASH end of operation interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector which has been erased + * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_EndOfOperationCallback could be implemented in the user file + */ +} + +/** + * @brief FLASH operation error interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector number which returned an error + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_OperationErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + memory operations. + +@endverbatim + * @{ + */ + +/** + * @brief Unlock the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Unlock(void) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + /* Authorize the FLASH Registers access */ + WRITE_REG(FLASH->KEYR, FLASH_KEY1); + WRITE_REG(FLASH->KEYR, FLASH_KEY2); + + /* Verify Flash is unlocked */ + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + status = HAL_ERROR; + } + } + + return status; +} + +/** + * @brief Locks the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Lock(void) +{ + /* Set the LOCK Bit to lock the FLASH Registers access */ + FLASH->CR |= FLASH_CR_LOCK; + + return HAL_OK; +} + +/** + * @brief Unlock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) +{ + if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) + { + /* Authorizes the Option Byte register programming */ + FLASH->OPTKEYR = FLASH_OPT_KEY1; + FLASH->OPTKEYR = FLASH_OPT_KEY2; + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Lock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) +{ + /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ + FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; + + return HAL_OK; +} + +/** + * @brief Launch the option byte loading. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) +{ + /* Set the OPTSTRT bit in OPTCR register */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; + + /* Wait for last operation to be completed */ + return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief Peripheral Errors functions + * +@verbatim + =============================================================================== + ##### Peripheral Errors functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time Errors of the FLASH peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Get the specific FLASH error flag. + * @retval FLASH_ErrorCode: The returned value can be a combination of: + * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) + * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag + * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag + * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag + * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag + * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag + */ +uint32_t HAL_FLASH_GetError(void) +{ + return pFlash.ErrorCode; +} + +/** + * @} + */ + +/** + * @brief Wait for a FLASH operation to complete. + * @param Timeout maximum flash operationtimeout + * @retval HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) +{ + uint32_t tickstart = 0U; + + /* Clear Error Code */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + Even if the FLASH operation fails, the BUSY flag will be reset and an error + flag will be set */ + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) + { + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) + { + return HAL_TIMEOUT; + } + } + } + + /* Check FLASH End of Operation flag */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + } +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* If there is no error flag set */ + return HAL_OK; + +} + +/** + * @brief Program a double word (64-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V and Vpp in the range 7V to 9V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; + FLASH->CR |= FLASH_CR_PG; + + /* Program first word */ + *(__IO uint32_t*)Address = (uint32_t)Data; + + /* Barrier to ensure programming is performed in 2 steps, in right order + (independently of compiler optimization behavior) */ + __ISB(); + + /* Program second word */ + *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); +} + + +/** + * @brief Program word (32-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Word(uint32_t Address, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint32_t*)Address = Data; +} + +/** + * @brief Program a half-word (16-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.1V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_HALF_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint16_t*)Address = Data; +} + +/** + * @brief Program byte (8-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 1.8V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_BYTE; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint8_t*)Address = Data; +} + +/** + * @brief Set the specific FLASH error flag. + * @retval None + */ +static void FLASH_SetErrorCode(void) +{ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; + + /* Clear FLASH write protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; + + /* Clear FLASH Programming alignment error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; + + /* Clear FLASH Programming parallelism error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; + + /* Clear FLASH Programming sequence error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); + } +#if defined(FLASH_SR_RDERR) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; + + /* Clear FLASH Proprietary readout protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); + } +#endif /* FLASH_SR_RDERR */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; + + /* Clear FLASH Operation error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c index b97cb0c2..066aa502 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c @@ -1,1350 +1,1350 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ex.c - * @author MCD Application Team - * @brief Extended FLASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the FLASH extension peripheral: - * + Extended programming operations functions - * - @verbatim - ============================================================================== - ##### Flash Extension features ##### - ============================================================================== - - [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and - STM32F429xx/439xx devices contains the following additional features - - (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write - capability (RWW) - (+) Dual bank memory organization - (+) PCROP protection for all banks - - ##### How to use this driver ##### - ============================================================================== - [..] This driver provides functions to configure and program the FLASH memory - of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx - devices. It includes - (#) FLASH Memory Erase functions: - (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and - HAL_FLASH_Lock() functions - (++) Erase function: Erase sector, erase all sectors - (++) There are two modes of erase : - (+++) Polling Mode using HAL_FLASHEx_Erase() - (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() - - (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : - (++) Set/Reset the write protection - (++) Set the Read protection Level - (++) Set the BOR level - (++) Program the user Option Bytes - (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : - (++) Extended space (bank 2) erase function - (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) - (++) Dual Boot activation - (++) Write protection configuration for bank 2 - (++) PCROP protection configuration and control for both banks - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASHEx FLASHEx - * @brief FLASH HAL Extension module driver - * @{ - */ - -#ifdef HAL_FLASH_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Constants - * @{ - */ -#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Variables - * @{ - */ -extern FLASH_ProcessTypeDef pFlash; -/** - * @} - */ - -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup FLASHEx_Private_Functions - * @{ - */ -/* Option bytes control */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); -static uint8_t FLASH_OB_GetUser(void); -static uint16_t FLASH_OB_GetWRP(void); -static uint8_t FLASH_OB_GetRDP(void); -static uint8_t FLASH_OB_GetBOR(void); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ - defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions - * @{ - */ - -/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions - * @brief Extended IO operation functions - * -@verbatim - =============================================================================== - ##### Extended programming operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the Extension FLASH - programming operations. - -@endverbatim - * @{ - */ -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors - * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @param[out] SectorError pointer to variable that - * contains the configuration information on faulty sector in case of error - * (0xFFFFFFFFU means that all the sectors have been correctly erased) - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) -{ - HAL_StatusTypeDef status = HAL_ERROR; - uint32_t index = 0U; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Initialization of SectorError variable*/ - *SectorError = 0xFFFFFFFFU; - - if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_MER_BIT); - } - else - { - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - /* Erase by sector by sector to be done*/ - for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) - { - FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - /* If the erase operation is completed, disable the SER and SNB Bits */ - CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); - - if(status != HAL_OK) - { - /* In case of error, stop erase procedure and return the faulty sector*/ - *SectorError = index; - break; - } - } - } - /* Flush the caches to be sure of the data consistency */ - FLASH_FlushCaches(); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled - * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that - * contains the configuration information for the erasing. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); - - /* Enable End of FLASH Operation interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); - - /* Enable Error source interrupt */ - __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); - - /* Clear pending flags (if any) */ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR); - - if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) - { - /*Mass erase to be done*/ - pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; - pFlash.Bank = pEraseInit->Banks; - FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); - } - else - { - /* Erase by sector to be done*/ - - /* Check the parameters */ - assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); - - pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; - pFlash.NbSectorsToErase = pEraseInit->NbSectors; - pFlash.Sector = pEraseInit->Sector; - pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; - - /*Erase 1st sector and wait for IT*/ - FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); - } - - return status; -} - -/** - * @brief Program option bytes - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Process Locked */ - __HAL_LOCK(&pFlash); - - /* Check the parameters */ - assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); - - /*Write protection configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) - { - assert_param(IS_WRPSTATE(pOBInit->WRPState)); - if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ - status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - else - { - /*Disable of Write protection on the selected Sector*/ - status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); - } - } - - /*Read protection configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) - { - status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); - } - - /*USER configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) - { - status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, - pOBInit->USERConfig&OB_STOP_NO_RST, - pOBInit->USERConfig&OB_STDBY_NO_RST); - } - - /*BOR Level configuration*/ - if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) - { - status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); - } - - /* Process Unlocked */ - __HAL_UNLOCK(&pFlash); - - return status; -} - -/** - * @brief Get the Option byte configuration - * @param pOBInit pointer to an FLASH_OBInitStruct structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) -{ - pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; - - /*Get WRP*/ - pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); - - /*Get RDP Level*/ - pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); - - /*Get USER*/ - pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); - - /*Get BOR Level*/ - pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); -} - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Program option bytes - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ - HAL_StatusTypeDef status = HAL_ERROR; - - /* Check the parameters */ - assert_param(IS_OBEX(pAdvOBInit->OptionType)); - - /*Program PCROP option byte*/ - if(((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) - { - /* Check the parameters */ - assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); - if((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) - { - /*Enable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - else - { - /*Disable of Write protection on the selected Sector*/ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - } - } - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - /*Program BOOT config option byte*/ - if(((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) - { - status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); - } -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - return status; -} - -/** - * @brief Get the OBEX byte configuration - * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that - * contains the configuration information for the programming. - * - * @retval None - */ -void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) -{ -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /*Get Sector*/ - pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ - /*Get Sector for Bank1*/ - pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); - - /*Get Sector for Bank2*/ - pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); - - /*Get Boot config OB*/ - pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ -} - -/** - * @brief Select the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); - - return HAL_OK; -} - -/** - * @brief Deselect the Protection Mode - * - * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted - * Global Read Out Protection modification (from level1 to level0) - * @note Once SPRMOD bit is active unprotection of a protected sector is not possible - * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ - * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. - * - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) -{ - uint8_t optiontmp = 0xFF; - - /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); - - /* Update Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); - - return HAL_OK; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ - STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 - * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/** - * @} - */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Full erase of FLASH memory sectors - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* if the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - - if(Banks == FLASH_BANK_BOTH) - { - /* bank1 & bank2 will be erased*/ - FLASH->CR |= FLASH_MER_BIT; - } - else if(Banks == FLASH_BANK_1) - { - /*Only bank1 will be erased*/ - FLASH->CR |= FLASH_CR_MER1; - } - else - { - /*Only bank2 will be erased*/ - FLASH->CR |= FLASH_CR_MER2; - } - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ - if(Sector > FLASH_SECTOR_11) - { - Sector += 4U; - } - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_SECTOR_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL FLASH State - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if(WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - - /*Write protection on all sector of BANK2*/ - if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); - } - } - - } - return status; -} - -/** - * @brief Disable the write protection of the desired bank1 or bank 2 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * This parameter can be one of the following values: - * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 - * @arg OB_WRP_Sector_All - * @note BANK2 starts from OB_WRP_SECTOR_12 - * - * @param Banks Disable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * @arg FLASH_BANK_2: Bank2 to be erased - * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || - (WRPSector < OB_WRP_SECTOR_12)) - { - if(WRPSector == OB_WRP_SECTOR_All) - { - /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - else - { - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - } - else - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - - /*Write protection on all sector of BANK2*/ - if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) - { - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); - } - } - - } - - return status; -} - -/** - * @brief Configure the Dual Bank Boot. - * - * @note This function can be used only for STM32F42xxx/43xxx devices. - * - * @param BootConfig specifies the Dual Bank Boot Option byte. - * This parameter can be one of the following values: - * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable - * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled - * @retval None - */ -static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_BOOT(BootConfig)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /* Set Dual Bank Boot */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; - } - - return status; -} - -/** - * @brief Enable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Enable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; - } - else - { - assert_param(IS_OB_PCROP(SectorBank2)); - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - - /*Write protection on all sector of BANK2*/ - if(Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; - } - } - - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired - * sectors of Bank 1 and/or Bank 2. - * @note This function can be used only for STM32F42xxx/43xxx devices. - * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 - * @arg OB_PCROP_SECTOR__All - * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 - * @arg OB_PCROP_SECTOR__All - * @param Banks Disable PCROP protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * @arg FLASH_BANK_2: WRP on all sectors of bank2 - * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) - { - assert_param(IS_OB_PCROP(SectorBank1)); - /*Write protection done on sectors of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); - } - else - { - /*Write protection done on sectors of BANK2*/ - assert_param(IS_OB_PCROP(SectorBank2)); - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - - /*Write protection on all sector of BANK2*/ - if(Banks == FLASH_BANK_BOTH) - { - assert_param(IS_OB_PCROP(SectorBank2)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); - } - } - - } - - return status; - -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ - defined(STM32F423xx) -/** - * @brief Mass erase of FLASH memory - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @param Banks Banks to be erased - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: Bank1 to be erased - * - * @retval None - */ -static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) -{ - /* Check the parameters */ - assert_param(IS_VOLTAGERANGE(VoltageRange)); - assert_param(IS_FLASH_BANK(Banks)); - - /* If the previous operation is completed, proceed to erase all sectors */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); -} - -/** - * @brief Erase the specified FLASH memory sector - * @param Sector FLASH sector to erase - * The value of this parameter depend on device used within the same series - * @param VoltageRange The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval None - */ -void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0U; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == FLASH_VOLTAGE_RANGE_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - - /* If the previous operation is completed, proceed to erase the sector */ - CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); - FLASH->CR |= tmp_psize; - CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); - FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); - FLASH->CR |= FLASH_CR_STRT; -} - -/** - * @brief Enable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); - } - - return status; -} - -/** - * @brief Disable the write protection of the desired bank 1 sectors - * - * @note When the memory read protection level is selected (RDP level = 1), - * it is not possible to program or erase the flash sector i if CortexM4 - * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 - * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). - * - * @param WRPSector specifies the sector(s) to be write protected. - * The value of this parameter depend on device used within the same series - * - * @param Banks Enable write protection on all the sectors for the specific bank - * This parameter can be one of the following values: - * @arg FLASH_BANK_1: WRP on all sectors of bank1 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_WRP_SECTOR(WRPSector)); - assert_param(IS_FLASH_BANK(Banks)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; - } - - return status; -} -#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; - } - - return status; -} - - -/** - * @brief Disable the read/write protection (PCROP) of the desired sectors. - * @note This function can be used only for STM32F401xx devices. - * @param Sector specifies the sector(s) to be read/write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 - * @arg OB_PCROP_Sector_All - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_PCROP(Sector)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~Sector); - } - - return status; - -} -#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx - STM32F413xx || STM32F423xx */ - -/** - * @brief Set the read protection level. - * @param Level specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - * - * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_RDP_LEVEL(Level)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = Level; - } - - return status; -} - -/** - * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param Iwdg Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param Stop Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NO_RST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param Stdby Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) -{ - uint8_t optiontmp = 0xFF; - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(Iwdg)); - assert_param(IS_OB_STOP_SOURCE(Stop)); - assert_param(IS_OB_STDBY_SOURCE(Stdby)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); - - if(status == HAL_OK) - { - /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); - } - - return status; -} - -/** - * @brief Set the BOR Level. - * @param Level specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval HAL Status - */ -static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR_LEVEL(Level)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; - - return HAL_OK; - -} - -/** - * @brief Return the FLASH User Option Byte value. - * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -static uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0)); -} - -/** - * @brief Return the FLASH Write Protection Option Bytes value. - * @retval uint16_t FLASH Write Protection Option Bytes value - */ -static uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @retval FLASH ReadOut Protection Status: - * This parameter can be one of the following values: - * @arg OB_RDP_LEVEL_0: No protection - * @arg OB_RDP_LEVEL_1: Read protection of the memory - * @arg OB_RDP_LEVEL_2: Full chip protection - */ -static uint8_t FLASH_OB_GetRDP(void) -{ - uint8_t readstatus = OB_RDP_LEVEL_0; - - if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2)) - { - readstatus = OB_RDP_LEVEL_2; - } - else if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0)) - { - readstatus = OB_RDP_LEVEL_0; - } - else - { - readstatus = OB_RDP_LEVEL_1; - } - - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @retval uint8_t The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -static uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @brief Flush the instruction and data caches - * @retval None - */ -void FLASH_FlushCaches(void) -{ - /* Flush instruction cache */ - if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN)!= RESET) - { - /* Disable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); - /* Reset instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_RESET(); - /* Enable instruction cache */ - __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - } - - /* Flush data cache */ - if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) - { - /* Disable data cache */ - __HAL_FLASH_DATA_CACHE_DISABLE(); - /* Reset data cache */ - __HAL_FLASH_DATA_CACHE_RESET(); - /* Enable data cache */ - __HAL_FLASH_DATA_CACHE_ENABLE(); - } -} - -/** - * @} - */ - -#endif /* HAL_FLASH_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.c + * @author MCD Application Team + * @brief Extended FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the FLASH extension peripheral: + * + Extended programming operations functions + * + @verbatim + ============================================================================== + ##### Flash Extension features ##### + ============================================================================== + + [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and + STM32F429xx/439xx devices contains the following additional features + + (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write + capability (RWW) + (+) Dual bank memory organization + (+) PCROP protection for all banks + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx + devices. It includes + (#) FLASH Memory Erase functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Erase function: Erase sector, erase all sectors + (++) There are two modes of erase : + (+++) Polling Mode using HAL_FLASHEx_Erase() + (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() + + (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Set the BOR level + (++) Program the user Option Bytes + (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : + (++) Extended space (bank 2) erase function + (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) + (++) Dual Boot activation + (++) Write protection configuration for bank 2 + (++) PCROP protection configuration and control for both banks + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Variables + * @{ + */ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ +/* Option bytes control */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); +static uint8_t FLASH_OB_GetUser(void); +static uint16_t FLASH_OB_GetWRP(void); +static uint8_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetBOR(void); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions + * @brief Extended IO operation functions + * +@verbatim + =============================================================================== + ##### Extended programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the Extension FLASH + programming operations. + +@endverbatim + * @{ + */ +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] SectorError pointer to variable that + * contains the configuration information on faulty sector in case of error + * (0xFFFFFFFFU means that all the sectors have been correctly erased) + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) +{ + HAL_StatusTypeDef status = HAL_ERROR; + uint32_t index = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Initialization of SectorError variable*/ + *SectorError = 0xFFFFFFFFU; + + if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the erase operation is completed, disable the MER Bit */ + FLASH->CR &= (~FLASH_MER_BIT); + } + else + { + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + /* Erase by sector by sector to be done*/ + for(index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) + { + FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the SER and SNB Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); + + if(status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty sector*/ + *SectorError = index; + break; + } + } + } + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches(); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled + * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + /* Clear pending flags (if any) */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\ + FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR); + + if(pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + pFlash.Bank = pEraseInit->Banks; + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + } + else + { + /* Erase by sector to be done*/ + + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; + pFlash.NbSectorsToErase = pEraseInit->NbSectors; + pFlash.Sector = pEraseInit->Sector; + pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; + + /*Erase 1st sector and wait for IT*/ + FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); + } + + return status; +} + +/** + * @brief Program option bytes + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); + + /*Write protection configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) + { + assert_param(IS_WRPSTATE(pOBInit->WRPState)); + if(pOBInit->WRPState == OB_WRPSTATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ + status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + else + { + /*Disable of Write protection on the selected Sector*/ + status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + } + + /*Read protection configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + { + status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + } + + /*USER configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + { + status = FLASH_OB_UserConfig(pOBInit->USERConfig&OB_IWDG_SW, + pOBInit->USERConfig&OB_STOP_NO_RST, + pOBInit->USERConfig&OB_STDBY_NO_RST); + } + + /*BOR Level configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) + { + status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Get the Option byte configuration + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) +{ + pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; + + /*Get WRP*/ + pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); + + /*Get RDP Level*/ + pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); + + /*Get USER*/ + pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); + + /*Get BOR Level*/ + pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Program option bytes + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram (FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_OBEX(pAdvOBInit->OptionType)); + + /*Program PCROP option byte*/ + if(((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) + { + /* Check the parameters */ + assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); + if((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + else + { + /*Disable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + } + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + /*Program BOOT config option byte*/ + if(((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) + { + status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); + } +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + return status; +} + +/** + * @brief Get the OBEX byte configuration + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /*Get Sector*/ + pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + /*Get Sector for Bank1*/ + pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); + + /*Get Sector for Bank2*/ + pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); + + /*Get Boot config OB*/ + pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ +} + +/** + * @brief Select the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) +{ + uint8_t optiontmp = 0xFF; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); + + return HAL_OK; +} + +/** + * @brief Deselect the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) +{ + uint8_t optiontmp = 0xFF; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); + + return HAL_OK; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ + STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. + * @retval The FLASH Write Protection Option Bytes value + */ +uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Full erase of FLASH memory sectors + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* if the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + + if(Banks == FLASH_BANK_BOTH) + { + /* bank1 & bank2 will be erased*/ + FLASH->CR |= FLASH_MER_BIT; + } + else if(Banks == FLASH_BANK_1) + { + /*Only bank1 will be erased*/ + FLASH->CR |= FLASH_CR_MER1; + } + else + { + /*Only bank2 will be erased*/ + FLASH->CR |= FLASH_CR_MER2; + } + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if(VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ + if(Sector > FLASH_SECTOR_11) + { + Sector += 4U; + } + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_SECTOR_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL FLASH State + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if(WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + + /*Write protection on all sector of BANK2*/ + if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); + } + } + + } + return status; +} + +/** + * @brief Disable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_Sector_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Disable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if(WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + + /*Write protection on all sector of BANK2*/ + if((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); + } + } + + } + + return status; +} + +/** + * @brief Configure the Dual Bank Boot. + * + * @note This function can be used only for STM32F42xxx/43xxx devices. + * + * @param BootConfig specifies the Dual Bank Boot Option byte. + * This parameter can be one of the following values: + * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable + * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled + * @retval None + */ +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_BOOT(BootConfig)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Set Dual Bank Boot */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; + } + + return status; +} + +/** + * @brief Enable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Enable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; + } + else + { + assert_param(IS_OB_PCROP(SectorBank2)); + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + + /*Write protection on all sector of BANK2*/ + if(Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + } + + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Disable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); + } + else + { + /*Write protection done on sectors of BANK2*/ + assert_param(IS_OB_PCROP(SectorBank2)); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + + /*Write protection on all sector of BANK2*/ + if(Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + } + + } + + return status; + +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** + * @brief Mass erase of FLASH memory + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * + * @retval None + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* If the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_CR_MER; + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange <<8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if(VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if(VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + + return status; +} + +/** + * @brief Disable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + + return status; +} +#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~Sector); + } + + return status; + +} +#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +/** + * @brief Set the read protection level. + * @param Level specifies the read protection level. + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + * + * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_RDP_LEVEL(Level)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = Level; + } + + return status; +} + +/** + * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @param Iwdg Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG selected + * @param Stop Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NO_RST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param Stdby Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) +{ + uint8_t optiontmp = 0xFF; + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(Iwdg)); + assert_param(IS_OB_STOP_SOURCE(Stop)); + assert_param(IS_OB_STDBY_SOURCE(Stdby)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); + + /* Update User Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); + } + + return status; +} + +/** + * @brief Set the BOR Level. + * @param Level specifies the Option Bytes BOR Reset Level. + * This parameter can be one of the following values: + * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) +{ + /* Check the parameters */ + assert_param(IS_OB_BOR_LEVEL(Level)); + + /* Set the BOR Level */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; + + return HAL_OK; + +} + +/** + * @brief Return the FLASH User Option Byte value. + * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +static uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return ((uint8_t)(FLASH->OPTCR & 0xE0)); +} + +/** + * @brief Return the FLASH Write Protection Option Bytes value. + * @retval uint16_t FLASH Write Protection Option Bytes value + */ +static uint16_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +} + +/** + * @brief Returns the FLASH Read Protection level. + * @retval FLASH ReadOut Protection Status: + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + */ +static uint8_t FLASH_OB_GetRDP(void) +{ + uint8_t readstatus = OB_RDP_LEVEL_0; + + if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2)) + { + readstatus = OB_RDP_LEVEL_2; + } + else if((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0)) + { + readstatus = OB_RDP_LEVEL_0; + } + else + { + readstatus = OB_RDP_LEVEL_1; + } + + return readstatus; +} + +/** + * @brief Returns the FLASH BOR level. + * @retval uint8_t The FLASH BOR level: + * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V + */ +static uint8_t FLASH_OB_GetBOR(void) +{ + /* Return the FLASH BOR level */ + return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); +} + +/** + * @brief Flush the instruction and data caches + * @retval None + */ +void FLASH_FlushCaches(void) +{ + /* Flush instruction cache */ + if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN)!= RESET) + { + /* Disable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); + /* Reset instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_RESET(); + /* Enable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); + } + + /* Flush data cache */ + if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) + { + /* Disable data cache */ + __HAL_FLASH_DATA_CACHE_DISABLE(); + /* Reset data cache */ + __HAL_FLASH_DATA_CACHE_RESET(); + /* Enable data cache */ + __HAL_FLASH_DATA_CACHE_ENABLE(); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c index 1fb20ec7..12db458b 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c @@ -1,175 +1,175 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_flash_ramfunc.c - * @author MCD Application Team - * @brief FLASH RAMFUNC module driver. - * This file provides a FLASH firmware functions which should be - * executed from internal SRAM - * + Stop/Start the flash interface while System Run - * + Enable/Disable the flash sleep while System Run - @verbatim - ============================================================================== - ##### APIs executed from Internal RAM ##### - ============================================================================== - [..] - *** ARM Compiler *** - -------------------- - [..] RAM functions are defined using the toolchain options. - Functions that are be executed in RAM should reside in a separate - source module. Using the 'Options for File' dialog you can simply change - the 'Code / Const' area of a module to a memory space in physical RAM. - Available memory areas are declared in the 'Target' tab of the - Options for Target' dialog. - - *** ICCARM Compiler *** - ----------------------- - [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". - - *** GNU Compiler *** - -------------------- - [..] RAM functions are defined using a specific toolchain attribute - "__attribute__((section(".RamFunc")))". - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC - * @brief FLASH functions executed from RAM - * @{ - */ -#ifdef HAL_FLASH_MODULE_ENABLED -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions - * @{ - */ - -/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### ramfunc functions ##### - =============================================================================== - [..] - This subsection provides a set of functions that should be executed from RAM - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Stop the flash interface while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Stop the flash interface while System Run */ - SET_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Start the flash interface while System Run - * @note This mode is only available for STM32F411xx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Start the flash interface while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FISSR); - - return HAL_OK; -} - -/** - * @brief Enable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode could n't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the flash sleep while System Run */ - SET_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @brief Disable the flash sleep while System Run - * @note This mode is only available for STM32F41xxx/STM32F446xx devices. - * @note This mode couldn't be set while executing with the flash itself. - * It should be done with specific routine executed from RAM. - * @retval HAL status - */ -__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) -{ - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Disable the flash sleep while System Run */ - CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ -#endif /* HAL_FLASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.c + * @author MCD Application Team + * @brief FLASH RAMFUNC module driver. + * This file provides a FLASH firmware functions which should be + * executed from internal SRAM + * + Stop/Start the flash interface while System Run + * + Enable/Disable the flash sleep while System Run + @verbatim + ============================================================================== + ##### APIs executed from Internal RAM ##### + ============================================================================== + [..] + *** ARM Compiler *** + -------------------- + [..] RAM functions are defined using the toolchain options. + Functions that are be executed in RAM should reside in a separate + source module. Using the 'Options for File' dialog you can simply change + the 'Code / Const' area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the + Options for Target' dialog. + + *** ICCARM Compiler *** + ----------------------- + [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". + + *** GNU Compiler *** + -------------------- + [..] RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC + * @brief FLASH functions executed from RAM + * @{ + */ +#ifdef HAL_FLASH_MODULE_ENABLED +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions + * @{ + */ + +/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### ramfunc functions ##### + =============================================================================== + [..] + This subsection provides a set of functions that should be executed from RAM + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Stop the flash interface while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Stop the flash interface while System Run */ + SET_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Start the flash interface while System Run + * @note This mode is only available for STM32F411xx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Start the flash interface while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Enable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode could n't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the flash sleep while System Run */ + SET_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @brief Disable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Disable the flash sleep while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#endif /* HAL_FLASH_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c index cef582d0..89090d6d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c @@ -1,537 +1,537 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_gpio.c - * @author MCD Application Team - * @brief GPIO HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the General Purpose Input/Output (GPIO) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * - @verbatim - ============================================================================== - ##### GPIO Peripheral features ##### - ============================================================================== - [..] - Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each - port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software - in several modes: - (+) Input mode - (+) Analog mode - (+) Output mode - (+) Alternate function mode - (+) External interrupt/event lines - - [..] - During and just after reset, the alternate functions and external interrupt - lines are not active and the I/O ports are configured in input floating mode. - - [..] - All GPIO pins have weak internal pull-up and pull-down resistors, which can be - activated or not. - - [..] - In Output or Alternate mode, each IO can be configured on open-drain or push-pull - type and the IO speed can be selected depending on the VDD value. - - [..] - All ports have external interrupt/event capability. To use external interrupt - lines, the port must be configured in input mode. All available GPIO pins are - connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. - - [..] - The external interrupt/event controller consists of up to 23 edge detectors - (16 lines are connected to GPIO) for generating event/interrupt requests (each - input line can be independently configured to select the type (interrupt or event) - and the corresponding trigger event (rising or falling or both). Each line can - also be masked independently. - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). - - (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). - (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure - (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef - structure. - (++) In case of Output or alternate function mode selection: the speed is - configured through "Speed" member from GPIO_InitTypeDef structure. - (++) In alternate mode is selection, the alternate function connected to the IO - is configured through "Alternate" member from GPIO_InitTypeDef structure. - (++) Analog mode is required when a pin is to be used as ADC channel - or DAC output. - (++) In case of external interrupt/event selection the "Mode" member from - GPIO_InitTypeDef structure select the type (interrupt or event) and - the corresponding trigger event (rising or falling or both). - - (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority - mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using - HAL_NVIC_EnableIRQ(). - - (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). - - (#) To set/reset the level of a pin configured in output mode use - HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). - - (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). - - - (#) During and just after reset, the alternate functions are not - active and the GPIO pins are configured in input floating mode (except JTAG - pins). - - (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose - (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has - priority over the GPIO function. - - (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as - general purpose PH0 and PH1, respectively, when the HSE oscillator is off. - The HSE has priority over the GPIO function. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup GPIO GPIO - * @brief GPIO HAL module driver - * @{ - */ - -#ifdef HAL_GPIO_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup GPIO_Private_Constants GPIO Private Constants - * @{ - */ -#define GPIO_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 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup GPIO_Exported_Functions GPIO Exported Functions - * @{ - */ - -/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to initialize and de-initialize the GPIOs - to be ready for use. - -@endverbatim - * @{ - */ - - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t temp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); - assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); - assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Output or Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || - (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Speed parameter */ - assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); - /* Configure the IO Speed */ - temp = GPIOx->OSPEEDR; - temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - temp |= (GPIO_Init->Speed << (position * 2U)); - GPIOx->OSPEEDR = temp; - - /* Configure the IO Output Type */ - temp = GPIOx->OTYPER; - temp &= ~(GPIO_OTYPER_OT_0 << position) ; - temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position); - GPIOx->OTYPER = temp; - } - - /* Activate the Pull-up or Pull down resistor for the current IO */ - temp = GPIOx->PUPDR; - temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - temp |= ((GPIO_Init->Pull) << (position * 2U)); - GPIOx->PUPDR = temp; - - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3U]; - temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - GPIOx->AFR[position >> 3U] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - GPIOx->MODER = temp; - - /*--------------------- EXTI Mode Configuration ------------------------*/ - /* Configure the External Interrupt or event for the current IO */ - if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) - { - /* Enable SYSCFG Clock */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - - temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(0x0FU << (4U * (position & 0x03U))); - temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - SYSCFG->EXTICR[position >> 2U] = temp; - - /* Clear EXTI line configuration */ - temp = EXTI->IMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) - { - temp |= iocurrent; - } - EXTI->IMR = temp; - - temp = EXTI->EMR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) - { - temp |= iocurrent; - } - EXTI->EMR = temp; - - /* Clear Rising Falling edge configuration */ - temp = EXTI->RTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) - { - temp |= iocurrent; - } - EXTI->RTSR = temp; - - temp = EXTI->FTSR; - temp &= ~((uint32_t)iocurrent); - if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) - { - temp |= iocurrent; - } - EXTI->FTSR = temp; - } - } - } -} - -/** - * @brief De-initializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) -{ - uint32_t position; - uint32_t ioposition = 0x00U; - uint32_t iocurrent = 0x00U; - uint32_t tmp = 0x00U; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - - /* Configure the port pins */ - for(position = 0U; position < GPIO_NUMBER; position++) - { - /* Get the IO position */ - ioposition = 0x01U << position; - /* Get the current IO position */ - iocurrent = (GPIO_Pin) & ioposition; - - if(iocurrent == ioposition) - { - /*------------------------- EXTI Mode Configuration --------------------*/ - tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (0x0FU << (4U * (position & 0x03U))); - if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~((uint32_t)iocurrent); - EXTI->EMR &= ~((uint32_t)iocurrent); - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~((uint32_t)iocurrent); - EXTI->FTSR &= ~((uint32_t)iocurrent); - - /* Configure the External Interrupt or event for the current IO */ - tmp = 0x0FU << (4U * (position & 0x03U)); - SYSCFG->EXTICR[position >> 2U] &= ~tmp; - } - - /*------------------------- GPIO Mode Configuration --------------------*/ - /* Configure IO Direction in Input Floating Mode */ - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); - - /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - - /* Configure the default value IO Output Type */ - GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - } - } -} - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to read. - * This parameter can be GPIO_PIN_x where x can be (0..15). - * @retval The input port pin value. - */ -GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - GPIO_PinState bitstatus; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) - { - bitstatus = GPIO_PIN_SET; - } - else - { - bitstatus = GPIO_PIN_RESET; - } - return bitstatus; -} - -/** - * @brief Sets or clears the selected data port bit. - * - * @note This function uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * - * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin specifies the port bit to be written. - * This parameter can be one of GPIO_PIN_x where x can be (0..15). - * @param PinState specifies the value to be written to the selected bit. - * This parameter can be one of the GPIO_PinState enum values: - * @arg GPIO_PIN_RESET: to clear the port pin - * @arg GPIO_PIN_SET: to set the port pin - * @retval None - */ -void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_PIN_ACTION(PinState)); - - if(PinState != GPIO_PIN_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - } -} - -/** - * @brief Toggles the specified GPIO pins. - * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or - * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. - * @param GPIO_Pin Specifies the pins to be toggled. - * @retval None - */ -void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) - { - GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; - } - else - { - GPIOx->BSRR = GPIO_Pin; - } -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family - * @param GPIO_Pin specifies the port bit to be locked. - * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). - * @retval None - */ -HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = GPIO_LCKR_LCKK; - - /* Check the parameters */ - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - /* Apply lock key write sequence */ - tmp |= GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ - GPIOx->LCKR = tmp; - /* Read LCKR register. This read is mandatory to complete key lock sequence */ - tmp = GPIOx->LCKR; - - /* Read again in order to confirm lock is active */ - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) - { - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief This function handles EXTI interrupt request. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) -{ - /* EXTI line interrupt detected */ - if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) - { - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); - HAL_GPIO_EXTI_Callback(GPIO_Pin); - } -} - -/** - * @brief EXTI line detection callbacks. - * @param GPIO_Pin Specifies the pins connected EXTI line - * @retval None - */ -__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(GPIO_Pin); - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_GPIO_EXTI_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_GPIO_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.c + * @author MCD Application Team + * @brief GPIO HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the General Purpose Input/Output (GPIO) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @verbatim + ============================================================================== + ##### GPIO Peripheral features ##### + ============================================================================== + [..] + Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each + port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software + in several modes: + (+) Input mode + (+) Analog mode + (+) Output mode + (+) Alternate function mode + (+) External interrupt/event lines + + [..] + During and just after reset, the alternate functions and external interrupt + lines are not active and the I/O ports are configured in input floating mode. + + [..] + All GPIO pins have weak internal pull-up and pull-down resistors, which can be + activated or not. + + [..] + In Output or Alternate mode, each IO can be configured on open-drain or push-pull + type and the IO speed can be selected depending on the VDD value. + + [..] + All ports have external interrupt/event capability. To use external interrupt + lines, the port must be configured in input mode. All available GPIO pins are + connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. + + [..] + The external interrupt/event controller consists of up to 23 edge detectors + (16 lines are connected to GPIO) for generating event/interrupt requests (each + input line can be independently configured to select the type (interrupt or event) + and the corresponding trigger event (rising or falling or both). Each line can + also be masked independently. + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). + + (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). + (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure + (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef + structure. + (++) In case of Output or alternate function mode selection: the speed is + configured through "Speed" member from GPIO_InitTypeDef structure. + (++) In alternate mode is selection, the alternate function connected to the IO + is configured through "Alternate" member from GPIO_InitTypeDef structure. + (++) Analog mode is required when a pin is to be used as ADC channel + or DAC output. + (++) In case of external interrupt/event selection the "Mode" member from + GPIO_InitTypeDef structure select the type (interrupt or event) and + the corresponding trigger event (rising or falling or both). + + (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority + mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using + HAL_NVIC_EnableIRQ(). + + (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). + + (#) To set/reset the level of a pin configured in output mode use + HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). + + (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). + + + (#) During and just after reset, the alternate functions are not + active and the GPIO pins are configured in input floating mode (except JTAG + pins). + + (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose + (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has + priority over the GPIO function. + + (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as + general purpose PH0 and PH1, respectively, when the HSE oscillator is off. + The HSE has priority over the GPIO function. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIO GPIO + * @brief GPIO HAL module driver + * @{ + */ + +#ifdef HAL_GPIO_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ +#define GPIO_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 +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize and de-initialize the GPIOs + to be ready for use. + +@endverbatim + * @{ + */ + + +/** + * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains + * the configuration information for the specified GPIO peripheral. + * @retval None + */ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t temp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Output or Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || + (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + /* Configure the IO Speed */ + temp = GPIOx->OSPEEDR; + temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + temp |= (GPIO_Init->Speed << (position * 2U)); + GPIOx->OSPEEDR = temp; + + /* Configure the IO Output Type */ + temp = GPIOx->OTYPER; + temp &= ~(GPIO_OTYPER_OT_0 << position) ; + temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position); + GPIOx->OTYPER = temp; + } + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPDR; + temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + temp |= ((GPIO_Init->Pull) << (position * 2U)); + GPIOx->PUPDR = temp; + + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3U]; + temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); + GPIOx->AFR[position >> 3U] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); + GPIOx->MODER = temp; + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) + { + /* Enable SYSCFG Clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + temp = SYSCFG->EXTICR[position >> 2U]; + temp &= ~(0x0FU << (4U * (position & 0x03U))); + temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); + SYSCFG->EXTICR[position >> 2U] = temp; + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) + { + temp |= iocurrent; + } + EXTI->IMR = temp; + + temp = EXTI->EMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) + { + temp |= iocurrent; + } + EXTI->EMR = temp; + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) + { + temp |= iocurrent; + } + EXTI->RTSR = temp; + + temp = EXTI->FTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) + { + temp |= iocurrent; + } + EXTI->FTSR = temp; + } + } + } +} + +/** + * @brief De-initializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t tmp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (GPIO_Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*------------------------- EXTI Mode Configuration --------------------*/ + tmp = SYSCFG->EXTICR[position >> 2U]; + tmp &= (0x0FU << (4U * (position & 0x03U))); + if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~((uint32_t)iocurrent); + EXTI->EMR &= ~((uint32_t)iocurrent); + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~((uint32_t)iocurrent); + EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = 0x0FU << (4U * (position & 0x03U)); + SYSCFG->EXTICR[position >> 2U] &= ~tmp; + } + + /*------------------------- GPIO Mode Configuration --------------------*/ + /* Configure IO Direction in Input Floating Mode */ + GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); + + /* Configure the default Alternate Function in current IO */ + GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + + /* Configure the default value IO Output Type */ + GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; + + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + } + } +} + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + * @brief GPIO Read and Write + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified input port pin. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to read. + * This parameter can be GPIO_PIN_x where x can be (0..15). + * @retval The input port pin value. + */ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + GPIO_PinState bitstatus; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) + { + bitstatus = GPIO_PIN_SET; + } + else + { + bitstatus = GPIO_PIN_RESET; + } + return bitstatus; +} + +/** + * @brief Sets or clears the selected data port bit. + * + * @note This function uses GPIOx_BSRR register to allow atomic read/modify + * accesses. In this way, there is no risk of an IRQ occurring between + * the read and the modify access. + * + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @param PinState specifies the value to be written to the selected bit. + * This parameter can be one of the GPIO_PinState enum values: + * @arg GPIO_PIN_RESET: to clear the port pin + * @arg GPIO_PIN_SET: to set the port pin + * @retval None + */ +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if(PinState != GPIO_PIN_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; + } +} + +/** + * @brief Toggles the specified GPIO pins. + * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin Specifies the pins to be toggled. + * @retval None + */ +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; + } + else + { + GPIOx->BSRR = GPIO_Pin; + } +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, + * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. + * @note The configuration of the locked GPIO pins can no longer be modified + * until the next reset. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family + * @param GPIO_Pin specifies the port bit to be locked. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + __IO uint32_t tmp = GPIO_LCKR_LCKK; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + tmp |= GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Read LCKR register. This read is mandatory to complete key lock sequence */ + tmp = GPIOx->LCKR; + + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + { + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief This function handles EXTI interrupt request. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) +{ + /* EXTI line interrupt detected */ + if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) + { + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + HAL_GPIO_EXTI_Callback(GPIO_Pin); + } +} + +/** + * @brief EXTI line detection callbacks. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(GPIO_Pin); + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_GPIO_EXTI_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + + +/** + * @} + */ + +#endif /* HAL_GPIO_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c index d736e82c..ba2ce59d 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c @@ -1,559 +1,559 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr.c - * @author MCD Application Team - * @brief PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWR PWR - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWR_Private_Constants - * @{ - */ - -/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask - * @{ - */ -#define PVD_MODE_IT 0x00010000U -#define PVD_MODE_EVT 0x00020000U -#define PVD_RISING_EDGE 0x00000001U -#define PVD_FALLING_EDGE 0x00000002U -/** - * @} - */ - -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Functions PWR Exported Functions - * @{ - */ - -/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - (+) Enable the Power Controller (PWR) APB1 interface clock using the - __HAL_RCC_PWR_CLK_ENABLE() macro. - (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. - * @retval None - */ -void HAL_PWR_DeInit(void) -{ - __HAL_RCC_PWR_FORCE_RESET(); - __HAL_RCC_PWR_RELEASE_RESET(); -} - -/** - * @brief Enables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @retval None - */ -void HAL_PWR_EnableBkUpAccess(void) -{ - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @retval None - */ -void HAL_PWR_DisableBkUpAccess(void) -{ - *(__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_PWR_PVD_EXTI_ENABLE_IT() macro. - (+) The PVD is stopped in Standby mode. - - *** Wake-up pin configuration *** - ================================ - [..] - (+) Wake-up pin is used to wake up the system from Standby mode. This pin is - forced in input pull-down configuration and is active on rising edges. - (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. - (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 - (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 - - *** Low Power modes configuration *** - ===================================== - [..] - The devices feature 3 low-power modes: - (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. - (+) Stop mode: all clocks are stopped, regulator running, regulator - in low power mode - (+) Standby mode: 1.2V domain powered off. - - *** Sleep mode *** - ================== - [..] - (+) Entry: - The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) - functions with - (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - - -@@- The Regulator parameter is not used for the STM32F4 family - and is kept as parameter just to maintain compatibility with the - lower power families (STM32L). - (+) Exit: - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - *** Stop mode *** - ================= - [..] - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. - It can be switched on again by software after exiting the Stop mode using - the HAL_PWREx_DisableFlashPowerDown() function. - - (+) Entry: - The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON) - function with: - (++) Main regulator ON. - (++) Low Power regulator ON. - (+) Exit: - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - *** Standby mode *** - ==================== - [..] - (+) - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - (++) Entry: - (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. - (++) Exit: - (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - *** Auto-wake-up (AWU) from low-power mode *** - ============================================= - [..] - - (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wake-up event, a tamper event or a time-stamp event, without depending on - an external interrupt (Auto-wake-up mode). - - (+) RTC auto-wake-up (AWU) from the Stop and Standby modes - - (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to - configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. - - (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to configure the RTC to detect the tamper or time stamp event using the - HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. - - (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to - configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration - * information for the PVD. - * @note Refer to the electrical characteristics of your device datasheet for - * more details about the voltage threshold corresponding to each - * detection level. - * @retval None - */ -void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) -{ - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); - assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); - - /* Set PLS[7:5] bits according to PVDLevel value */ - MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); - - /* Clear any previous config. Keep it clear if no event or IT mode is selected */ - __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); - __HAL_PWR_PVD_EXTI_DISABLE_IT(); - __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); - __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); - - /* Configure interrupt mode */ - if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) - { - __HAL_PWR_PVD_EXTI_ENABLE_IT(); - } - - /* Configure event mode */ - if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) - { - __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); - } - - /* Configure the edge */ - if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); - } - - if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) - { - __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); - } -} - -/** - * @brief Enables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_EnablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Power Voltage Detector(PVD). - * @retval None - */ -void HAL_PWR_DisablePVD(void) -{ - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Enable the wake up pin */ - SET_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Disables the Wake-up PINx functionality. - * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. - * This parameter can be one of the following values: - * @arg PWR_WAKEUP_PIN1 - * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices - * @retval None - */ -void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) -{ - /* Check the parameter */ - assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); - - /* Disable the wake up pin */ - CLEAR_BIT(PWR->CSR, WakeUpPinx); -} - -/** - * @brief Enters Sleep mode. - * - * @note In Sleep mode, all I/O pins keep the same state as in Run mode. - * - * @note In Sleep mode, the systick is stopped to avoid exit from this mode with - * systick interrupt when used as time base for Timeout - * - * @param Regulator Specifies the regulator state in SLEEP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON - * @note This parameter is not used for the STM32F4 family and is kept as parameter - * just to maintain compatibility with the lower power families. - * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction - * @retval None - */ -void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); - - /* Clear SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select SLEEP mode entry -------------------------------------------------*/ - if(SLEEPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* 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 issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * @param Regulator Specifies the regulator state in Stop mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON - * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON - * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction - * @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction - * @retval None - */ -void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ - MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* Select Stop mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_STOPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __SEV(); - __WFE(); - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); -} - -/** - * @brief Enters Standby mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @retval None - */ -void HAL_PWR_EnterSTANDBYMode(void) -{ - /* Select Standby mode */ - SET_BIT(PWR->CR, PWR_CR_PDDS); - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); - - /* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief This function handles the PWR PVD interrupt request. - * @note This API should be called under the PVD_IRQHandler(). - * @retval None - */ -void HAL_PWR_PVD_IRQHandler(void) -{ - /* Check PWR Exti flag */ - if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) - { - /* PWR PVD interrupt user callback */ - HAL_PWR_PVDCallback(); - - /* Clear PWR Exti pending bit */ - __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); - } -} - -/** - * @brief PWR PVD interrupt callback - * @retval None - */ -__weak void HAL_PWR_PVDCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PWR_PVDCallback could be implemented in the user file - */ -} - -/** - * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. - * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * Setting this bit is useful when the processor is expected to run only on - * interruptions handling. - * @retval None - */ -void HAL_PWR_EnableSleepOnExit(void) -{ - /* Set SLEEPONEXIT bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. - * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor - * re-enters SLEEP mode when an interruption handling is over. - * @retval None - */ -void HAL_PWR_DisableSleepOnExit(void) -{ - /* Clear SLEEPONEXIT bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); -} - -/** - * @brief Enables CORTEX M4 SEVONPEND bit. - * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_EnableSEVOnPend(void) -{ - /* Set SEVONPEND bit of Cortex System Control Register */ - SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @brief Disables CORTEX M4 SEVONPEND bit. - * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes - * WFE to wake up when an interrupt moves from inactive to pended. - * @retval None - */ -void HAL_PWR_DisableSEVOnPend(void) -{ - /* Clear SEVONPEND bit of Cortex System Control Register */ - CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWR_Private_Constants + * @{ + */ + +/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask + * @{ + */ +#define PVD_MODE_IT 0x00010000U +#define PVD_MODE_EVT 0x00020000U +#define PVD_RISING_EDGE 0x00000001U +#define PVD_FALLING_EDGE 0x00000002U +/** + * @} + */ + +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + After reset, the backup domain (RTC registers, RTC backup data + registers and backup SRAM) is protected against possible unwanted + write accesses. + To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + __HAL_RCC_PWR_CLK_ENABLE() macro. + (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. + * @retval None + */ +void HAL_PWR_DeInit(void) +{ + __HAL_RCC_PWR_FORCE_RESET(); + __HAL_RCC_PWR_RELEASE_RESET(); +} + +/** + * @brief Enables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + *(__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_PWR_PVD_EXTI_ENABLE_IT() macro. + (+) The PVD is stopped in Standby mode. + + *** Wake-up pin configuration *** + ================================ + [..] + (+) Wake-up pin is used to wake up the system from Standby mode. This pin is + forced in input pull-down configuration and is active on rising edges. + (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. + (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 + (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 + + *** Low Power modes configuration *** + ===================================== + [..] + The devices feature 3 low-power modes: + (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. + (+) Stop mode: all clocks are stopped, regulator running, regulator + in low power mode + (+) Standby mode: 1.2V domain powered off. + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) + functions with + (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + + -@@- The Regulator parameter is not used for the STM32F4 family + and is kept as parameter just to maintain compatibility with the + lower power families (STM32L). + (+) Exit: + Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep mode. + + *** Stop mode *** + ================= + [..] + In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, + and the HSE RC oscillators are disabled. Internal SRAM and register contents + are preserved. + The voltage regulator can be configured either in normal or low-power mode. + To minimize the consumption In Stop mode, FLASH can be powered off before + entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. + It can be switched on again by software after exiting the Stop mode using + the HAL_PWREx_DisableFlashPowerDown() function. + + (+) Entry: + The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON) + function with: + (++) Main regulator ON. + (++) Low Power regulator ON. + (+) Exit: + Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + + *** Standby mode *** + ==================== + [..] + (+) + The Standby mode allows to achieve the lowest power consumption. It is based + on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. + The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and + the HSE oscillator are also switched off. SRAM and register contents are lost + except for the RTC registers, RTC backup registers, backup SRAM and Standby + circuitry. + + The voltage regulator is OFF. + + (++) Entry: + (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. + (++) Exit: + (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, + tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + + *** Auto-wake-up (AWU) from low-power mode *** + ============================================= + [..] + + (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + Wake-up event, a tamper event or a time-stamp event, without depending on + an external interrupt (Auto-wake-up mode). + + (+) RTC auto-wake-up (AWU) from the Stop and Standby modes + + (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to + configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. + + (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it + is necessary to configure the RTC to detect the tamper or time stamp event using the + HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. + + (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to + configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration + * information for the PVD. + * @note Refer to the electrical characteristics of your device datasheet for + * more details about the voltage threshold corresponding to each + * detection level. + * @retval None + */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) +{ + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); + assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); + + /* Set PLS[7:5] bits according to PVDLevel value */ + MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); + + /* Clear any previous config. Keep it clear if no event or IT mode is selected */ + __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); + __HAL_PWR_PVD_EXTI_DISABLE_IT(); + __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + + /* Configure interrupt mode */ + if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) + { + __HAL_PWR_PVD_EXTI_ENABLE_IT(); + } + + /* Configure event mode */ + if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) + { + __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); + } + + /* Configure the edge */ + if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); + } + + if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + } +} + +/** + * @brief Enables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_EnablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_DisablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Enable the wake up pin */ + SET_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Disables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Disable the wake up pin */ + CLEAR_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Enters Sleep mode. + * + * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + * + * @note In Sleep mode, the systick is stopped to avoid exit from this mode with + * systick interrupt when used as time base for Timeout + * + * @param Regulator Specifies the regulator state in SLEEP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON + * @note This parameter is not used for the STM32F4 family and is kept as parameter + * just to maintain compatibility with the lower power families. + * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if(SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* 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 issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * @param Regulator Specifies the regulator state in Stop mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON + * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction + * @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select Stop mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Enters Standby mode. + * @note In Standby mode, all I/O pins are high impedance except for: + * - Reset pad (still available) + * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC + * Alarm out, or RTC clock calibration out. + * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. + * - WKUP pin 1 (PA0) if enabled. + * @retval None + */ +void HAL_PWR_EnterSTANDBYMode(void) +{ + /* Select Standby mode */ + SET_BIT(PWR->CR, PWR_CR_PDDS); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWR_PVD_IRQHandler(void) +{ + /* Check PWR Exti flag */ + if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) + { + /* PWR PVD interrupt user callback */ + HAL_PWR_PVDCallback(); + + /* Clear PWR Exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); + } +} + +/** + * @brief PWR PVD interrupt callback + * @retval None + */ +__weak void HAL_PWR_PVDCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_PWR_PVDCallback could be implemented in the user file + */ +} + +/** + * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. + * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * Setting this bit is useful when the processor is expected to run only on + * interruptions handling. + * @retval None + */ +void HAL_PWR_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. + * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * @retval None + */ +void HAL_PWR_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enables CORTEX M4 SEVONPEND bit. + * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_EnableSEVOnPend(void) +{ + /* Set SEVONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Disables CORTEX M4 SEVONPEND bit. + * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_DisableSEVOnPend(void) +{ + /* Clear SEVONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c index b13988ef..0d26083a 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c @@ -1,604 +1,604 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_pwr_ex.c - * @author MCD Application Team - * @brief Extended PWR HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of PWR extension peripheral: - * + Peripheral Extended features functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup PWREx PWREx - * @brief PWR HAL module driver - * @{ - */ - -#ifdef HAL_PWR_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup PWREx_Private_Constants - * @{ - */ -#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U -#define PWR_BKPREG_TIMEOUT_VALUE 1000U -#define PWR_VOSRDY_TIMEOUT_VALUE 1000U -/** - * @} - */ - - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup PWREx_Exported_Functions PWREx Exported Functions - * @{ - */ - -/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions - * @brief Peripheral Extended features functions - * -@verbatim - - =============================================================================== - ##### Peripheral extended features functions ##### - =============================================================================== - - *** Main and Backup Regulators configuration *** - ================================================ - [..] - (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from - the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is - retained even in Standby or VBAT mode when the low power backup regulator - is enabled. It can be considered as an internal EEPROM when VBAT is - always present. You can use the HAL_PWREx_EnableBkUpReg() function to - enable the low power backup regulator. - - (+) When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - (+) The backup SRAM is not mass erased by a tamper event. It is read - protected to prevent confidential data, such as cryptographic private - key, from being accessed. The backup SRAM can be erased only through - the Flash interface when a protection level change from level 1 to - level 0 is requested. - -@- Refer to the description of Read protection (RDP) in the Flash - programming manual. - - (+) The main internal regulator can be configured to have a tradeoff between - performance and power consumption when the device does not operate at - the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() - macro which configure VOS bit in PWR_CR register - - Refer to the product datasheets for more details. - - *** FLASH Power Down configuration **** - ======================================= - [..] - (+) By setting the FPDS bit in the PWR_CR register by using the - HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power - down mode when the device enters Stop mode. When the Flash memory - is in power down mode, an additional startup delay is incurred when - waking up from Stop mode. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL - is OFF and the HSI or HSE clock source is selected as system clock. - The new value programmed is active only when the PLL is ON. - When the PLL is OFF, the voltage scale 3 is automatically selected. - Refer to the datasheets for more details. - - *** Over-Drive and Under-Drive configuration **** - ================================================= - [..] - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has - 2 operating modes available: - (++) Normal mode: The CPU and core logic operate at maximum frequency at a given - voltage scaling (scale 1, scale 2 or scale 3) - (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a - higher frequency than the normal mode for a given voltage scaling (scale 1, - scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and - disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow - the sequence described in Reference manual. - - (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator - supplies a low power voltage to the 1.2V domain, thus preserving the content of registers - and internal SRAM. 2 operating modes are available: - (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only - available when the main regulator or the low power regulator is used in Scale 3 or - low voltage mode. - (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only - available when the main regulator or the low power regulator is in low voltage mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Disables the Backup Regulator. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) -{ - uint32_t tickstart = 0U; - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till Backup regulator ready flag is set */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) - { - if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Enables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_EnableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Flash Power Down in Stop mode. - * @retval None - */ -void HAL_PWREx_DisableFlashPowerDown(void) -{ - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Return Voltage Scaling Range. - * @retval The configured scale for the regulator voltage(VOS bit field). - * The returned value can be one of the following: - * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode - * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode - */ -uint32_t HAL_PWREx_GetVoltageRange(void) -{ - return (PWR->CR & PWR_CR_VOS); -} - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK = 168 MHz. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK = 144 MHz. - * @note When moving from Range 1 to Range 2, the system frequency must be decreased to - * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. - * When moving from Range 2 to Range 1, the system frequency can be increased to - * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ - defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Configures the main internal regulator output voltage. - * @param VoltageScaling specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption. - * This parameter can be one of the following values: - * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, - * the maximum value of fHCLK is 168 MHz. It can be extended to - * 180 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, - * the maximum value of fHCLK is 144 MHz. It can be extended to, - * 168 MHz by activating the over-drive mode. - * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, - * the maximum value of fHCLK is 120 MHz. - * @note To update the system clock frequency(SYSCLK): - * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). - * - Call the HAL_RCC_OscConfig() to configure the PLL. - * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. - * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). - * @note The scale can be modified only when the HSI or HSE clock source is selected - * as system clock source, otherwise the API returns HAL_ERROR. - * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits - * value in the PWR_CR1 register are not taken in account. - * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. - * @note The new voltage scale is active only when the PLL is ON. - * @retval HAL Status - */ -HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) -{ - uint32_t tickstart = 0U; - - assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); - - /* Enable PWR RCC Clock Peripheral */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - /* Disable the main PLL */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set Range */ - __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); - - /* Enable the main PLL */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) - { - if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - return HAL_ERROR; - } - - return HAL_OK; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ - defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Enables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Main Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xxdevices. - * @retval None - */ -void HAL_PWREx_DisableMainRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; -} - -/** - * @brief Enables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_EnableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables Low Power Regulator low voltage mode. - * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ - * STM32F413xx/STM32F423xx devices. - * @retval None - */ -void HAL_PWREx_DisableLowRegulatorLowVoltage(void) -{ - *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; -} - -#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || - STM32F413xx || STM32F423xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Activates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ - __HAL_PWR_OVERDRIVE_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Enable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - return HAL_OK; -} - -/** - * @brief Deactivates the Over-Drive mode. - * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * This mode allows the CPU and the core logic to operate at a higher frequency - * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). - * @note It is recommended to enter or exit Over-drive mode when the application is not running - * critical tasks and when the system clock source is either HSI or HSE. - * During the Over-drive switch activation, no peripheral clocks should be enabled. - * The peripheral clocks must be enabled once the Over-drive mode is activated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) -{ - uint32_t tickstart = 0U; - - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Disable the Over-drive switch */ - __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Disable the Over-drive */ - __HAL_PWR_OVERDRIVE_DISABLE(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Enters in Under-Drive STOP mode. - * - * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. - * - * @note This mode can be selected only when the Under-Drive is already active - * - * @note This mode is enabled only with STOP low power mode. - * In this mode, the 1.2V domain is preserved in reduced leakage mode. This - * mode is only available when the main regulator or the low power regulator - * is in low voltage mode - * - * @note If the Under-drive mode was enabled, it is automatically disabled after - * exiting Stop mode. - * When the voltage regulator operates in Under-drive mode, an additional - * startup delay is induced when waking up from Stop mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * - * @note When exiting Stop mode by issuing an interrupt or a wake-up event, - * the HSI RC oscillator is selected as system clock. - * - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param Regulator specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode - * and Flash memory in power-down when the device is in Stop under-drive mode - * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction - * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction - * @retval None - */ -HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) -{ - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); - assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); - - /* Enable Power ctrl clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - /* Enable the Under-drive Mode ---------------------------------------------*/ - /* Clear Under-drive flag */ - __HAL_PWR_CLEAR_ODRUDR_FLAG(); - - /* Enable the Under-drive */ - __HAL_PWR_UNDERDRIVE_ENABLE(); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg1 = PWR->CR; - /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ - tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); - - /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ - tmpreg1 |= Regulator; - - /* Store the new value */ - PWR->CR = tmpreg1; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(STOPEntry == PWR_SLEEPENTRY_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); - - return HAL_OK; -} - -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_PWR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.c + * @author MCD Application Team + * @brief Extended PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of PWR extension peripheral: + * + Peripheral Extended features functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWREx PWREx + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWREx_Private_Constants + * @{ + */ +#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_BKPREG_TIMEOUT_VALUE 1000U +#define PWR_VOSRDY_TIMEOUT_VALUE 1000U +/** + * @} + */ + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### Peripheral extended features functions ##### + =============================================================================== + + *** Main and Backup Regulators configuration *** + ================================================ + [..] + (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from + the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is + retained even in Standby or VBAT mode when the low power backup regulator + is enabled. It can be considered as an internal EEPROM when VBAT is + always present. You can use the HAL_PWREx_EnableBkUpReg() function to + enable the low power backup regulator. + + (+) When the backup domain is supplied by VDD (analog switch connected to VDD) + the backup SRAM is powered from VDD which replaces the VBAT power supply to + save battery life. + + (+) The backup SRAM is not mass erased by a tamper event. It is read + protected to prevent confidential data, such as cryptographic private + key, from being accessed. The backup SRAM can be erased only through + the Flash interface when a protection level change from level 1 to + level 0 is requested. + -@- Refer to the description of Read protection (RDP) in the Flash + programming manual. + + (+) The main internal regulator can be configured to have a tradeoff between + performance and power consumption when the device does not operate at + the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() + macro which configure VOS bit in PWR_CR register + + Refer to the product datasheets for more details. + + *** FLASH Power Down configuration **** + ======================================= + [..] + (+) By setting the FPDS bit in the PWR_CR register by using the + HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power + down mode when the device enters Stop mode. When the Flash memory + is in power down mode, an additional startup delay is incurred when + waking up from Stop mode. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL + is OFF and the HSI or HSE clock source is selected as system clock. + The new value programmed is active only when the PLL is ON. + When the PLL is OFF, the voltage scale 3 is automatically selected. + Refer to the datasheets for more details. + + *** Over-Drive and Under-Drive configuration **** + ================================================= + [..] + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has + 2 operating modes available: + (++) Normal mode: The CPU and core logic operate at maximum frequency at a given + voltage scaling (scale 1, scale 2 or scale 3) + (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a + higher frequency than the normal mode for a given voltage scaling (scale 1, + scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and + disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow + the sequence described in Reference manual. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator + supplies a low power voltage to the 1.2V domain, thus preserving the content of registers + and internal SRAM. 2 operating modes are available: + (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only + available when the main regulator or the low power regulator is used in Scale 3 or + low voltage mode. + (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only + available when the main regulator or the low power regulator is in low voltage mode. + +@endverbatim + * @{ + */ + +/** + * @brief Enables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Disables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Enables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_EnableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_DisableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Return Voltage Scaling Range. + * @retval The configured scale for the regulator voltage(VOS bit field). + * The returned value can be one of the following: + * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + */ +uint32_t HAL_PWREx_GetVoltageRange(void) +{ + return (PWR->CR & PWR_CR_VOS); +} + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK = 168 MHz. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK = 144 MHz. + * @note When moving from Range 1 to Range 2, the system frequency must be decreased to + * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. + * When moving from Range 2 to Range 1, the system frequency can be increased to + * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK is 168 MHz. It can be extended to + * 180 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK is 144 MHz. It can be extended to, + * 168 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, + * the maximum value of fHCLK is 120 MHz. + * @note To update the system clock frequency(SYSCLK): + * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). + * - Call the HAL_RCC_OscConfig() to configure the PLL. + * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. + * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). + * @note The scale can be modified only when the HSI or HSE clock source is selected + * as system clock source, otherwise the API returns HAL_ERROR. + * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits + * value in the PWR_CR1 register are not taken in account. + * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. + * @note The new voltage scale is active only when the PLL is ON. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + /* Disable the main PLL */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Enable the main PLL */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xxdevices. + * @retval None + */ +void HAL_PWREx_DisableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_DisableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; +} + +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Activates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ + __HAL_PWR_OVERDRIVE_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Enable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Deactivates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Disable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Disable the Over-drive */ + __HAL_PWR_OVERDRIVE_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Enters in Under-Drive STOP mode. + * + * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * + * @note This mode can be selected only when the Under-Drive is already active + * + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode + * + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + * + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * + * @note When exiting Stop mode by issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * + * @param Regulator specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction + * @retval None + */ +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the Under-drive Mode ---------------------------------------------*/ + /* Clear Under-drive flag */ + __HAL_PWR_CLEAR_ODRUDR_FLAG(); + + /* Enable the Under-drive */ + __HAL_PWR_UNDERDRIVE_ENABLE(); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg1 = PWR->CR; + /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ + tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); + + /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ + tmpreg1 |= Regulator; + + /* Store the new value */ + PWR->CR = tmpreg1; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Select STOP mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + return HAL_OK; +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c index f63dea4c..7640b65f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -1,1114 +1,1114 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc.c - * @author MCD Application Team - * @brief RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Reset and Clock Control (RCC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * - @verbatim - ============================================================================== - ##### RCC specific features ##### - ============================================================================== - [..] - After reset the device is running from Internal High Speed oscillator - (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - and I-Cache are disabled, and all peripherals are off except internal - SRAM, Flash and JTAG. - (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; - all peripherals mapped on these busses are running at HSI speed. - (+) The clock for all peripherals is switched off, except the SRAM and FLASH. - (+) All GPIOs are in input floating state, except the JTAG pins which - are assigned to be used for debug purpose. - - [..] - Once the device started from reset, the user application has to: - (+) Configure the clock source to be used to drive the System clock - (if the application needs higher frequency/performance) - (+) Configure the System clock frequency and Flash settings - (+) Configure the AHB and APB busses prescalers - (+) Enable the clock for the peripheral(s) to be used - (+) Configure the clock source(s) for peripherals which clocks are not - derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - - ##### RCC Limitations ##### - ============================================================================== - [..] - A delay between an RCC peripheral clock enable and the effective peripheral - enabling should be taken into account in order to manage the peripheral read/write - from/to registers. - (+) This delay depends on the peripheral mapping. - (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle - after the clock enable bit is set on the hardware register - (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle - after the clock enable bit is set on the hardware register - - [..] - Implemented Workaround: - (+) For AHB & APB peripherals, a dummy read to the peripheral register has been - inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCC RCC - * @brief RCC HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCC_Private_Constants - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ -#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define MCO1_GPIO_PORT GPIOA -#define MCO1_PIN GPIO_PIN_8 - -#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define MCO2_GPIO_PORT GPIOC -#define MCO2_PIN GPIO_PIN_9 -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup RCC_Private_Variables RCC Private Variables - * @{ - */ -/** - * @} - */ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Functions RCC Exported Functions - * @{ - */ - -/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] - This section provides functions allowing to configure the internal/external oscillators - (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 - and APB2). - - [..] Internal/external clock and PLL configuration - (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - (#) PLL (clocked by HSI or HSE), featuring two different output clocks: - (++) The first output is used to generate the high speed system clock (up to 168 MHz) - (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() - and if a HSE clock failure occurs(HSE used directly or through PLL as System - clock source), the System clocks automatically switched to HSI and an interrupt - is generated if enabled. The interrupt is linked to the Cortex-M4 NMI - (Non-Maskable Interrupt) exception vector. - - (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - - [..] System, AHB and APB busses clocks configuration - (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable - prescaler and used to clock the CPU, memory and peripherals mapped - on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived - from AHB clock through configurable prescalers and used to clock - the peripherals mapped on these busses. You can use - "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. - - (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum - frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, - the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, - PCLK2 84 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - - (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, - PCLK2 100 MHz and PCLK1 50 MHz. - Depending on the device voltage range, the maximum frequency should - be adapted accordingly (refer to the product datasheets for more details). - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - return HAL_OK; -} - -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart, pll_config; - - /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - { - /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - RCC_OscInitStruct->PLL.PLLM | \ - (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ - (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ - (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - /* Check if there is a request to disable the PLL used as System clock source */ - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - { - return HAL_ERROR; - } - else - { - /* Do not return HAL_ERROR if request repeats the current configuration */ - pll_config = RCC->PLLCFGR; - if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != RCC_OscInitStruct->PLL.PLLN) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != RCC_OscInitStruct->PLL.PLLP) || - (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != RCC_OscInitStruct->PLL.PLLQ)) - { - return HAL_ERROR; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Initializes the CPU, AHB and APB busses clocks according to the specified - * parameters in the RCC_ClkInitStruct. - * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC peripheral. - * @param FLatency FLASH Latency, this parameter depend on device selected - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated by HAL_RCC_GetHCLKFreq() function called within this function - * - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * - * @note Depending on the device voltage range, the software has to set correctly - * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above "Initialization/de-initialization functions") - * @retval None - */ -HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) -{ - uint32_t tickstart; - - /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); - assert_param(IS_FLASH_LATENCY(FLatency)); - - /* To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. */ - - /* Increasing the number of wait states because of higher CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - { - /* Set the highest APBx dividers in order to ensure that we do not go through - a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - } - - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - } - - assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - } - - /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - { - assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); - - /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - { - /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - return HAL_ERROR; - } - } - /* PLL is selected as System Clock Source */ - else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - { - /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - return HAL_ERROR; - } - } - /* HSI is selected as System Clock Source */ - else - { - /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - return HAL_ERROR; - } - } - - __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) - { - /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ - __HAL_FLASH_SET_LATENCY(FLatency); - - /* Check that the new number of wait states is taken into account to access the Flash - memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) - { - return HAL_ERROR; - } - } - - /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - } - - /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - { - assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); - MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - } - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; - - /* Configure the source of time base considering new system clocks settings */ - HAL_InitTick (uwTickPrio); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions - * @brief RCC clocks control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - -@endverbatim - * @{ - */ - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). - * @note PA8/PC9 should be configured in alternate function mode. - * @param RCC_MCOx specifies the output direction for the clock source. - * This parameter can be one of the following values: - * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). - * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). - * @param RCC_MCOSource specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source - * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx - * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices - * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCODiv specifies the MCOx prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCODIV_1: no division applied to MCOx clock - * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock - * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock - * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock - * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock - * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have - * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). - * @retval None - */ -void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) -{ - GPIO_InitTypeDef GPIO_InitStruct; - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCOx)); - assert_param(IS_RCC_MCODIV(RCC_MCODiv)); - /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) - { - assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); - - /* MCO1 Clock Enable */ - __MCO1_CLK_ENABLE(); - - /* Configure the MCO1 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); - - /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ -#if defined(RCC_CFGR_MCO1EN) - __HAL_RCC_MCO1_ENABLE(); -#endif /* RCC_CFGR_MCO1EN */ - } -#if defined(RCC_CFGR_MCO2) - else - { - assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); - - /* MCO2 Clock Enable */ - __MCO2_CLK_ENABLE(); - - /* Configure the MCO2 pin in alternate function mode */ - GPIO_InitStruct.Pin = MCO2_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Alternate = GPIO_AF0_MCO; - HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); - - /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ - MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); - - /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ -#if defined(RCC_CFGR_MCO2EN) - __HAL_RCC_MCO2_ENABLE(); -#endif /* RCC_CFGR_MCO2EN */ - } -#endif /* RCC_CFGR_MCO2 */ -} - -/** - * @brief Enables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @retval None - */ -void HAL_RCC_EnableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; -} - -/** - * @brief Disables the Clock Security System. - * @retval None - */ -void HAL_RCC_DisableCSS(void) -{ - *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; -} - -/** - * @brief Returns the SYSCLK frequency - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -__weak uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U, pllvco = 0U, pllp = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); - - sysclockfreq = pllvco/pllp; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} - -/** - * @brief Returns the HCLK frequency - * @note Each time HCLK changes, this function must be called to update the - * right HCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency - * and updated within this function - * @retval HCLK frequency - */ -uint32_t HAL_RCC_GetHCLKFreq(void) -{ - return SystemCoreClock; -} - -/** - * @brief Returns the PCLK1 frequency - * @note Each time PCLK1 changes, this function must be called to update the - * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK1 frequency - */ -uint32_t HAL_RCC_GetPCLK1Freq(void) -{ - /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); -} - -/** - * @brief Returns the PCLK2 frequency - * @note Each time PCLK2 changes, this function must be called to update the - * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. - * @retval PCLK2 frequency - */ -uint32_t HAL_RCC_GetPCLK2Freq(void) -{ - /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * will be configured. - * @retval None - */ -__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); -} - -/** - * @brief Configures the RCC_ClkInitStruct according to the internal - * RCC configuration registers. - * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that - * will be configured. - * @param pFLatency Pointer on the Flash Latency. - * @retval None - */ -void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) -{ - /* Set all possible values for the Clock type parameter --------------------*/ - RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - - /* Get the SYSCLK configuration --------------------------------------------*/ - RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); - - /* Get the HCLK configuration ----------------------------------------------*/ - RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); - - /* Get the APB1 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); - - /* Get the APB2 configuration ----------------------------------------------*/ - RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); - - /* Get the Flash Wait State (Latency) configuration ------------------------*/ - *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); -} - -/** - * @brief This function handles the RCC CSS interrupt request. - * @note This API should be called under the NMI_Handler(). - * @retval None - */ -void HAL_RCC_NMI_IRQHandler(void) -{ - /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) - { - /* RCC Clock Security System interrupt user callback */ - HAL_RCC_CSSCallback(); - - /* Clear RCC CSS pending bit */ - __HAL_RCC_CLEAR_IT(RCC_IT_CSS); - } -} - -/** - * @brief RCC Clock Security System interrupt callback - * @retval None - */ -__weak void HAL_RCC_CSSCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_RCC_CSSCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from Internal High Speed oscillator + (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache + and I-Cache are disabled, and all peripherals are off except internal + SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; + all peripherals mapped on these busses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + + [..] + Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB busses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals which clocks are not + derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) + + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle + after the clock enable bit is set on the hardware register + (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle + after the clock enable bit is set on the hardware register + + [..] + Implemented Workaround: + (+) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC + * @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/* Private macro -------------------------------------------------------------*/ +#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define MCO2_GPIO_PORT GPIOC +#define MCO2_PIN GPIO_PIN_9 +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal/external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + + (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or + through the PLL as System clock source. Can be used also as RTC clock source. + + (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + + (#) PLL (clocked by HSI or HSE), featuring two different output clocks: + (++) The first output is used to generate the high speed system clock (up to 168 MHz) + (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), + the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). + + (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() + and if a HSE clock failure occurs(HSE used directly or through PLL as System + clock source), the System clocks automatically switched to HSI and an interrupt + is generated if enabled. The interrupt is linked to the Cortex-M4 NMI + (Non-Maskable Interrupt) exception vector. + + (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL + clock (through a configurable prescaler) on PA8 pin. + + (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S + clock (through a configurable prescaler) on PC9 pin. + + [..] System, AHB and APB busses clocks configuration + (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these busses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum + frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, + the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, + PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, + PCLK2 100 MHz and PCLK1 50 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + +@endverbatim + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + return HAL_OK; +} + +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart, pll_config; + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + RCC_OscInitStruct->PLL.PLLM | \ + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; + if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != RCC_OscInitStruct->PLL.PLLN) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != RCC_OscInitStruct->PLL.PLLP) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != RCC_OscInitStruct->PLL.PLLQ)) + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Initializes the CPU, AHB and APB busses clocks according to the specified + * parameters in the RCC_ClkInitStruct. + * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC peripheral. + * @param FLatency FLASH Latency, this parameter depend on device selected + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used (enabled by hardware) as system clock source after + * startup from Reset, wake-up from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after startup delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source will be ready. + * + * @note Depending on the device voltage range, the software has to set correctly + * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency + * (for more details refer to section above "Initialization/de-initialization functions") + * @retval None + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + uint32_t tickstart; + + /* Check Null pointer */ + if(RCC_ClkInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + assert_param(IS_FLASH_LATENCY(FLatency)); + + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) and the supply voltage of the device. */ + + /* Increasing the number of wait states because of higher CPU frequency */ + if(FLatency > __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + { + /* Set the highest APBx dividers in order to ensure that we do not go through + a non-spec phase whatever we decrease or increase HCLK. */ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); + } + + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); + } + + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + { + /* Check the HSE ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + return HAL_ERROR; + } + } + /* PLL is selected as System Clock Source */ + else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || + (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) + { + /* Check the PLL ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + return HAL_ERROR; + } + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + return HAL_ERROR; + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if(FLatency < __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + } + + /*-------------------------- PCLK2 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + + /* Configure the source of time base considering new system clocks settings */ + HAL_InitTick (uwTickPrio); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions + * @brief RCC clocks control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + +@endverbatim + * @{ + */ + +/** + * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). + * @note PA8/PC9 should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). + * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param RCC_MCODiv specifies the MCOx prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have + * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + * @retval None + */ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef GPIO_InitStruct; + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + /* RCC_MCO1 */ + if(RCC_MCOx == RCC_MCO1) + { + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + + /* MCO1 Clock Enable */ + __MCO1_CLK_ENABLE(); + + /* Configure the MCO1 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO1_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); + + /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ +#if defined(RCC_CFGR_MCO1EN) + __HAL_RCC_MCO1_ENABLE(); +#endif /* RCC_CFGR_MCO1EN */ + } +#if defined(RCC_CFGR_MCO2) + else + { + assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); + + /* MCO2 Clock Enable */ + __MCO2_CLK_ENABLE(); + + /* Configure the MCO2 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO2_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); + + /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ +#if defined(RCC_CFGR_MCO2EN) + __HAL_RCC_MCO2_ENABLE(); +#endif /* RCC_CFGR_MCO2EN */ + } +#endif /* RCC_CFGR_MCO2 */ +} + +/** + * @brief Enables the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. + * @retval None + */ +void HAL_RCC_EnableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Clock Security System. + * @retval None + */ +void HAL_RCC_DisableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns the SYSCLK frequency + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +__weak uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U, pllvco = 0U, pllp = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); + + sysclockfreq = pllvco/pllp; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} + +/** + * @brief Returns the HCLK frequency + * @note Each time HCLK changes, this function must be called to update the + * right HCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated within this function + * @retval HCLK frequency + */ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/** + * @brief Returns the PCLK1 frequency + * @note Each time PCLK1 changes, this function must be called to update the + * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK1 frequency + */ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); +} + +/** + * @brief Returns the PCLK2 frequency + * @note Each time PCLK2 changes, this function must be called to update the + * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK2 frequency + */ +uint32_t HAL_RCC_GetPCLK2Freq(void) +{ + /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * will be configured. + * @retval None + */ +__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); +} + +/** + * @brief Configures the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that + * will be configured. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Set all possible values for the Clock type parameter --------------------*/ + RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + + /* Get the SYSCLK configuration --------------------------------------------*/ + RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + + /* Get the HCLK configuration ----------------------------------------------*/ + RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + + /* Get the APB1 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); + + /* Get the APB2 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); + + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +} + +/** + * @brief This function handles the RCC CSS interrupt request. + * @note This API should be called under the NMI_Handler(). + * @retval None + */ +void HAL_RCC_NMI_IRQHandler(void) +{ + /* Check RCC CSSF flag */ + if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_CSSCallback(); + + /* Clear RCC CSS pending bit */ + __HAL_RCC_CLEAR_IT(RCC_IT_CSS); + } +} + +/** + * @brief RCC Clock Security System interrupt callback + * @retval None + */ +__weak void HAL_RCC_CSSCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_RCC_CSSCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c index bca349ca..0d3aacc8 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c @@ -1,3754 +1,3754 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_rcc_ex.c - * @author MCD Application Team - * @brief Extension RCC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities RCC extension peripheral: - * + Extended Peripheral Control functions - * - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup RCCEx RCCEx - * @brief RCCEx HAL module driver - * @{ - */ - -#ifdef HAL_RCC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup RCCEx_Private_Constants - * @{ - */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions - * @{ - */ - -/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions - * @brief Extended Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Extended Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the RCC Clocks - frequencies. - [..] - (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to - select the RTC clock source; in this case the Backup domain will be reset in - order to modify the RTC Clock source, as consequence RTC registers (including - the backup registers) and RCC_BDCR register are set to their reset values. - -@endverbatim - * @{ - */ - -#if defined(STM32F446xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t plli2sp = 0U; - uint32_t plli2sq = 0U; - uint32_t plli2sr = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t plli2sused = 0U; - uint32_t pllsaiused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*------------------------ I2S APB1 configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- I2S APB2 configuration ----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*--------------------------- SAI1 configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------- SAI2 configuration ----------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); - - /* Configure SAI2 Clock source */ - __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- RTC configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ CEC Configuration -------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) - { - /* Check the parameters */ - assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); - - /* Configure the CEC clock source */ - __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- CLK48 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLSAI when it's used as clock source for CLK48 */ - if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) - { - pllsaiused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- SDIO Configuration -------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SPDIFRX Configuration ---------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) - { - /* Check the parameters */ - assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); - - /* Configure the SPDIFRX clock source */ - __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); - /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ - if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- PLLI2S Configuration ------------------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, - I2S on APB2 or SPDIFRX */ - if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - /* Check for PLLI2S/DIVQ parameters */ - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------- PLLSAI Configuration -----------------------*/ - /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ - if(pllsaiused == 1U) - { - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) - { - /* check for PLLSAIQ Parameter */ - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - /* check for PLLSAI/DIVQ Parameter */ - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ - /* In Case of PLLI2S is selected as source clock for CLK48 */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Configure the PLLSAI division factors */ - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ - /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ - RCC_PERIPHCLK_SPDIFRX; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - - /* Get the SAI1 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); - - /* Get the SAI2 clock configuration ----------------------------------------*/ - PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CEC clock configuration -----------------------------------------*/ - PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ----------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the SPDIFRX clock configuration -------------------------------------*/ - PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock - * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - uint32_t tmpreg1 = 0U; - /* This variable used to store the SAI clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the SAI clock source */ - uint32_t saiclocksource = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_SAI1: - case RCC_PERIPHCLK_SAI2: - { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) - { - case 0U: /* PLLSAI is the clock source for SAI*/ - { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) - { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); - } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); - } - break; - } - default : - { - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F446xx */ - -#if defined(STM32F469xx) || defined(STM32F479xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC, RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - uint32_t pllsaip = 0U; - uint32_t pllsaiq = 0U; - uint32_t pllsair = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*--------------------------- CLK48 Configuration --------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the CLK48 clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------ SDIO Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*------------------- Common configuration SAI/I2S -------------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------- I2S configuration -------------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for these peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ - pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - - /*---------------------------- CLK48 configuration ------------------------*/ - /* Configure the PLLSAI when it is used as clock source for CLK48 */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && - (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) - { - assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); - - /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); - } - - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI |\ - RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration --------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the CLK48 clock configuration -------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F469xx || STM32F479xx */ - -#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; -#if defined(STM32F413xx) || defined(STM32F423xx) - uint32_t plli2sq = 0U; -#endif /* STM32F413xx || STM32F423xx */ - uint32_t plli2sused = 0U; - - /* Check the peripheral clock selection parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------------------- I2S APB1 configuration ---------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------------------- I2S APB2 configuration ---------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); - - /* Configure I2S Clock source */ - __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); - /* Enable the PLLI2S when it's used as clock source for I2S */ - if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*----------------------- SAI1 Block A configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------- SAI1 Block B configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) - { - /* Check the parameters */ - assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); - - /* Configure SAI1 Clock source */ - __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); - /* Enable the PLLI2S when it's used as clock source for SAI */ - if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) - { - plli2sused = 1U; - } - /* Enable the PLLSAI when it's used as clock source for SAI */ - if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) - { - /* Check for PLL/DIVR parameters */ - assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ - __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); - } - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - /*------------------------------------ RTC configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------ TIM configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - /* Configure Timer Prescaler */ - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- FMPI2C1 Configuration --------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- CLK48 Configuration ----------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) - { - /* Check the parameters */ - assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); - - /* Enable the PLLI2S when it's used as clock source for CLK48 */ - if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) - { - plli2sused = 1U; - } - } - /*--------------------------------------------------------------------------*/ - - /*------------------------------------- SDIO Configuration -----------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); - - /* Configure the SDIO clock source */ - __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------------------------- PLLI2S Configuration --------------*/ - /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or - I2S on APB2*/ - if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) - { - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* check for common PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - /*-------------------- Set the PLL I2S clock -----------------------------*/ - __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); - - /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ - if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || - ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) - { - /* Check for PLLI2S Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Check for PLLI2S/DIVR parameters */ - assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); - - /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ - plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); - } -#endif /* STM32F413xx || STM32F423xx */ - - /*----------------- In Case of PLLI2S is just selected ------------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 clock source configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM1 Audio clock source configuration -------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - -#if defined(STM32F413xx) || defined(STM32F423xx) - /*-------------------- DFSDM2 clock source configuration -------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); - - /* Configure the DFSDM1 interface clock source */ - __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*-------------------- DFSDM2 Audio clock source configuration -------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) - { - /* Check the parameters */ - assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); - - /* Configure the DFSDM1 Audio interface clock source */ - __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - /*--------------------------------------------------------------------------*/ -#endif /* STM32F413xx || STM32F423xx */ - - return HAL_OK; -} - -/** - * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ -#if defined(STM32F413xx) || defined(STM32F423xx) - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ - RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 |\ - RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 |\ - RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; -#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ - RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ - RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ - RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ - RCC_PERIPHCLK_DFSDM1_AUDIO; -#endif /* STM32F413xx || STM32F423xx */ - - - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the PLL/PLLI2S division factors -------------------------------------*/ - PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); - PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the I2S APB1 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); - - /* Get the I2S APB2 clock configuration ------------------------------------*/ - PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); - - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the CLK48 clock configuration ---------------------------------------*/ - PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); - - /* Get the SDIO clock configuration ----------------------------------------*/ - PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); - - /* Get the DFSDM1 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); - - /* Get the DFSDM1 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); - -#if defined(STM32F413xx) || defined(STM32F423xx) - /* Get the DFSDM2 clock configuration --------------------------------------*/ - PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); - - /* Get the DFSDM2 Audio clock configuration --------------------------------*/ - PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); - - /* Get the LPTIM1 clock configuration --------------------------------------*/ - PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); - - /* Get the SAI1 Block Aclock configuration ---------------------------------*/ - PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); - - /* Get the SAI1 Block B clock configuration --------------------------------*/ - PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); -#endif /* STM32F413xx || STM32F423xx */ - - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(I2S..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock - * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S_APB1: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLI2S: - { - if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB1CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB1CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - case RCC_PERIPHCLK_I2S_APB2: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLI2S: - { - if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - } - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPB2CLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPB2CLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- FMPI2C1 Configuration -----------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) - { - /* Check the parameters */ - assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); - - /* Configure the FMPI2C1 clock source */ - __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- LPTIM1 Configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) - { - /* Check the parameters */ - assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); - - /* Configure the LPTIM1 clock source */ - __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); - } - - /*---------------------------- I2S Configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) - { - /* Check the parameters */ - assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); - - /* Configure the I2S clock source */ - __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); - } - - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } - /* Get the FMPI2C1 clock configuration -------------------------------------*/ - PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); - - /* Get the I2S clock configuration -----------------------------------------*/ - PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); - - -} -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ - case RCC_I2SAPBCLKSOURCE_PLLR: - { - /* Configure the PLL division factor R */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLL_VCO Output/PLLR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ - case RCC_I2SAPBCLKSOURCE_PLLSRC: - { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - frequency = HSE_VALUE; - } - else - { - frequency = HSI_VALUE; - } - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified - * parameters in the RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals - * clocks(I2S, SAI, LTDC RTC and TIM). - * - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_BDCR register are set to their reset values. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ - /*----------------------- Common configuration SAI/I2S ---------------------*/ - /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- I2S configuration -------------------------*/ - /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added - only for I2S configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) - { - /* Check the PLLI2S division factors */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); - - /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); - } - - /*----------------- In Case of PLLI2S is just selected -----------------*/ - if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) - { - /* Check for Parameters */ - assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - - /* Configure the PLLI2S multiplication and division factors */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); - } - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ - /*----------------------- Common configuration SAI/LTDC --------------------*/ - /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division - factor is common parameters for both peripherals */ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) - { - /* Check the PLLSAI division factors */ - assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); - - /* Disable PLLSAI Clock */ - __HAL_RCC_PLLSAI_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is disabled */ - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /*---------------------------- SAI configuration -------------------------*/ - /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must - be added only for SAI configuration */ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) - { - assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); - assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); - } - - /*---------------------------- LTDC configuration ------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) - { - assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); - assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); - - /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ - tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); - /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ - __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); - } - /* Enable PLLSAI Clock */ - __HAL_RCC_PLLSAI_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLSAI is ready */ - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } - /*--------------------------------------------------------------------------*/ - - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } - return HAL_OK; -} - -/** - * @brief Configures the PeriphClkInit according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); - PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); - /* Get the PLLSAI Clock configuration -----------------------------------------------*/ - PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); - PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); - PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); - /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ - PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); - PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); - PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); - /* Get the RTC Clock configuration -----------------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -/** - * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the - * RCC_PeriphCLKInitTypeDef. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). - * - * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case - * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup - * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tickstart = 0U; - uint32_t tmpreg1 = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); - - /*---------------------------- I2S configuration ---------------------------*/ - if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || - (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) - { - /* check for Parameters */ - assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); - assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); -#if defined(STM32F411xE) - assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); -#endif /* STM32F411xE */ - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - -#if defined(STM32F411xE) - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); -#else - /* Configure the PLLI2S division factors */ - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ - /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); -#endif /* STM32F411xE */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait till PLLI2S is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - } - - /*---------------------------- RTC configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) - { - /* Check for RTC Parameters used to output RTCCLK */ - assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); - - /* Enable Power Clock*/ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* Enable write access to Backup domain */ - PWR->CR |= PWR_CR_DBP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while((PWR->CR & PWR_CR_DBP) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ - tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); - if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) - { - /* Store the content of BDCR register before the reset of Backup Domain */ - tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); - /* RTC Clock selection can be changed only if the Backup Domain is reset */ - __HAL_RCC_BACKUPRESET_FORCE(); - __HAL_RCC_BACKUPRESET_RELEASE(); - /* Restore the Content of BDCR register */ - RCC->BDCR = tmpreg1; - - /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ - if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) - { - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); - } -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /*---------------------------- TIM configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) - { - __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that - * will be configured. - * @retval None - */ -void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) -{ - uint32_t tempreg; - - /* Set all possible values for the extended clock type parameter------------*/ - PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; - - /* Get the PLLI2S Clock configuration --------------------------------------*/ - PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); - PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); -#if defined(STM32F411xE) - PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); -#endif /* STM32F411xE */ - /* Get the RTC Clock configuration -----------------------------------------*/ - tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); - PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); - -#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) - /* Get the TIM Prescaler configuration -------------------------------------*/ - if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; - } - else - { - PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; - } -#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ -} - -/** - * @brief Return the peripheral clock frequency for a given peripheral(SAI..) - * @note Return 0 if peripheral clock identifier not managed by this API - * @param PeriphClk Peripheral clock identifier - * This parameter can be one of the following values: - * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock - * @retval Frequency in KHz - */ -uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) -{ - /* This variable used to store the I2S clock frequency (value in Hz) */ - uint32_t frequency = 0U; - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - uint32_t srcclk = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - switch (PeriphClk) - { - case RCC_PERIPHCLK_I2S: - { - /* Get the current I2S source */ - srcclk = __HAL_RCC_GET_I2S_SOURCE(); - switch (srcclk) - { - /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ - case RCC_I2SCLKSOURCE_EXT: - { - /* Set the I2S clock to the external clock value */ - frequency = EXTERNAL_CLOCK_VALUE; - break; - } - /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ - case RCC_I2SCLKSOURCE_PLLI2S: - { -#if defined(STM32F411xE) - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } -#else - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } -#endif /* STM32F411xE */ - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } - /* Clock not enabled for I2S*/ - default: - { - frequency = 0U; - break; - } - } - break; - } - } - return frequency; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if(Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions - * @brief Extended Clock management functions - * -@verbatim - =============================================================================== - ##### Extended clock management functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the - activation or deactivation of PLLI2S, PLLSAI. -@endverbatim - * @{ - */ - -#if defined(RCC_PLLI2S_SUPPORT) -/** - * @brief Enable PLLI2S. - * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that - * contains the configuration information for the PLLI2S - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); -#if defined(RCC_PLLI2SCFGR_PLLI2SM) - assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); -#endif /* RCC_PLLI2SCFGR_PLLI2SM */ -#if defined(RCC_PLLI2SCFGR_PLLI2SP) - assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); -#endif /* RCC_PLLI2SCFGR_PLLI2SP */ -#if defined(RCC_PLLI2SCFGR_PLLI2SQ) - assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); -#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLI2S division factors */ -#if defined(STM32F446xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ - PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F469xx) || defined(STM32F479xx) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ - /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); -#elif defined(STM32F411xE) - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#else - /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ - /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ - __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); -#endif /* STM32F446xx */ - - /* Enable the PLLI2S */ - __HAL_RCC_PLLI2S_ENABLE(); - - /* Wait till PLLI2S is ready */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLI2S. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) -{ - uint32_t tickstart; - - /* Disable the PLLI2S */ - __HAL_RCC_PLLI2S_DISABLE(); - - /* Wait till PLLI2S is disabled */ - tickstart = HAL_GetTick(); - while(READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) -/** - * @brief Enable PLLSAI. - * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that - * contains the configuration information for the PLLSAI - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) -{ - uint32_t tickstart; - - /* Check for parameters */ - assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); - assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); -#if defined(RCC_PLLSAICFGR_PLLSAIM) - assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); -#endif /* RCC_PLLSAICFGR_PLLSAIM */ -#if defined(RCC_PLLSAICFGR_PLLSAIP) - assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); -#endif /* RCC_PLLSAICFGR_PLLSAIP */ -#if defined(RCC_PLLSAICFGR_PLLSAIR) - assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); -#endif /* RCC_PLLSAICFGR_PLLSAIR */ - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - /* Configure the PLLSAI division factors */ -#if defined(STM32F446xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ - PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); -#elif defined(STM32F469xx) || defined(STM32F479xx) - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ - /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ - PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#else - /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ - /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ - /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ - __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); -#endif /* STM32F446xx */ - - /* Enable the PLLSAI */ - __HAL_RCC_PLLSAI_ENABLE(); - - /* Wait till PLLSAI is ready */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) - { - if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Disable PLLSAI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) -{ - uint32_t tickstart; - - /* Disable the PLLSAI */ - __HAL_RCC_PLLSAI_DISABLE(); - - /* Wait till PLLSAI is disabled */ - tickstart = HAL_GetTick(); - while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) - { - if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - /* return in case of Timeout detected */ - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -#endif /* RCC_PLLSAI_SUPPORT */ - -/** - * @} - */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); - - sysclockfreq = pllvco/pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - - sysclockfreq = pllvco/pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL, PLLI2S and PLLSAI OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_DeInit(void) -{ - uint32_t tickstart; - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Set HSION bit to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSION); - - /* Wait till HSI is ready */ - while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) - { - if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Set HSITRIM[4:0] bits to the reset value */ - SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Wait till clock switch is ready */ - while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) - { - if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear HSEON, HSEBYP and CSSON bits */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); - - /* Wait till HSE is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Clear PLLON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLON); - - /* Wait till PLL is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - -#if defined(RCC_PLLI2S_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLI2SON bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLI2S_SUPPORT */ - -#if defined(RCC_PLLSAI_SUPPORT) - /* Get Start Tick */ - tickstart = HAL_GetTick(); - - /* Reset PLLSAI bit */ - CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); - - /* Wait till PLLSAI is disabled */ - while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) - { - if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } -#endif /* RCC_PLLSAI_SUPPORT */ - - /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; -#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) - RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; -#else - RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ - - /* Reset PLLI2SCFGR register to default value */ -#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ - defined(STM32F423xx) || defined(STM32F446xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; -#elif defined(STM32F411xE) - RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; -#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ - - /* Reset PLLSAICFGR register */ -#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; -#elif defined(STM32F446xx) - RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; -#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ - - /* Disable all interrupts */ - CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); - -#if defined(RCC_CIR_PLLI2SRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); -#endif /* RCC_CIR_PLLI2SRDYIE */ - -#if defined(RCC_CIR_PLLSAIRDYIE) - CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); -#endif /* RCC_CIR_PLLSAIRDYIE */ - - /* Clear all interrupt flags */ - SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC); - -#if defined(RCC_CIR_PLLI2SRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); -#endif /* RCC_CIR_PLLI2SRDYC */ - -#if defined(RCC_CIR_PLLSAIRDYC) - SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); -#endif /* RCC_CIR_PLLSAIRDYC */ - - /* Clear LSION bit */ - CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); - - /* Reset all CSR flags */ - SET_BIT(RCC->CSR, RCC_CSR_RMVF); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; - - /* Adapt Systick interrupt period */ - if(HAL_InitTick(uwTickPrio) != HAL_OK) - { - return HAL_ERROR; - } - else - { - return HAL_OK; - } -} - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the RCC Oscillators according to the specified parameters in the - * RCC_OscInitTypeDef. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that - * contains the configuration information for the RCC Oscillators. - * @note The PLL is not disabled when used as system clock. - * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not - * supported by this API. User should request a transition to LSE Off - * first and then LSE On or LSE Bypass. - * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not - * supported by this API. User should request a transition to HSE Off - * first and then HSE On or HSE Bypass. - * @note This function add the PLL/PLLR factor management during PLL configuration this feature - * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - uint32_t tickstart = 0U; - - /* Check the parameters */ - assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); - /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - { - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); - /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ -#if defined(STM32F446xx) - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#else - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) -#endif /* STM32F446xx */ - { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - { - return HAL_ERROR; - } - } - else - { - /* Set the new HSE configuration ---------------------------------------*/ - __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - - /* Check the HSE State */ - if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - { - /* Check the parameters */ - assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); - assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); - - /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ -#if defined(STM32F446xx) - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#else - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) -#endif /* STM32F446xx */ - { - /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - { - return HAL_ERROR; - } - /* Otherwise, just the calibration is allowed */ - else - { - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - } - else - { - /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) - { - /* Enable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ - __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - } - else - { - /* Disable the Internal High Speed oscillator (HSI). */ - __HAL_RCC_HSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - } - /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - { - /* Check the parameters */ - assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); - - /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) - { - /* Enable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the Internal Low Speed oscillator (LSI). */ - __HAL_RCC_LSI_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - { - FlagStatus pwrclkchanged = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); - - /* Update LSE configuration in Backup Domain control register */ - /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) - { - __HAL_RCC_PWR_CLK_ENABLE(); - pwrclkchanged = SET; - } - - if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - /* Enable write access to Backup domain */ - SET_BIT(PWR->CR, PWR_CR_DBP); - - /* Wait for Backup domain Write protection disable */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - { - if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Set the new LSE configuration -----------------------------------------*/ - __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - - /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) - { - __HAL_RCC_PWR_CLK_DISABLE(); - } - } - /*-------------------------------- PLL Configuration -----------------------*/ - /* Check the parameters */ - assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); - if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - { - /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - { - /* Check the parameters */ - assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); - assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); - assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); - assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); - - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - - /* Configure the main PLL clock source, multiplication and division factors. */ - __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, - RCC_OscInitStruct->PLL.PLLM, - RCC_OscInitStruct->PLL.PLLN, - RCC_OscInitStruct->PLL.PLLP, - RCC_OscInitStruct->PLL.PLLQ, - RCC_OscInitStruct->PLL.PLLR); - - /* Enable the main PLL. */ - __HAL_RCC_PLL_ENABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - else - { - /* Disable the main PLL. */ - __HAL_RCC_PLL_DISABLE(); - - /* Get Start Tick*/ - tickstart = HAL_GetTick(); - - /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - } - } - else - { - return HAL_ERROR; - } - } - return HAL_OK; -} - -/** - * @brief Configures the RCC_OscInitStruct according to the internal - * RCC configuration registers. - * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. - * - * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * @note This function add the PLL/PLLR factor management - * @retval None - */ -void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) -{ - /* Set all possible values for the Oscillator type parameter ---------------*/ - RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; - - /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) - { - RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; - } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) - { - RCC_OscInitStruct->HSEState = RCC_HSE_ON; - } - else - { - RCC_OscInitStruct->HSEState = RCC_HSE_OFF; - } - - /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) - { - RCC_OscInitStruct->HSIState = RCC_HSI_ON; - } - else - { - RCC_OscInitStruct->HSIState = RCC_HSI_OFF; - } - - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); - - /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) - { - RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; - } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) - { - RCC_OscInitStruct->LSEState = RCC_LSE_ON; - } - else - { - RCC_OscInitStruct->LSEState = RCC_LSE_OFF; - } - - /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) - { - RCC_OscInitStruct->LSIState = RCC_LSI_ON; - } - else - { - RCC_OscInitStruct->LSIState = RCC_LSI_OFF; - } - - /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; - } - else - { - RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; - } - RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); - RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); - RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); - RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); -} -#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#endif /* HAL_RCC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extension RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCCEx RCCEx + * @brief RCCEx HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCCEx_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + [..] + (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + select the RTC clock source; in this case the Backup domain will be reset in + order to modify the RTC Clock source, as consequence RTC registers (including + the backup registers) and RCC_BDCR register are set to their reset values. + +@endverbatim + * @{ + */ + +#if defined(STM32F446xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t plli2sp = 0U; + uint32_t plli2sq = 0U; + uint32_t plli2sr = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t plli2sused = 0U; + uint32_t pllsaiused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*------------------------ I2S APB1 configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- I2S APB2 configuration ----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*--------------------------- SAI1 configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------- SAI2 configuration ----------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); + + /* Configure SAI2 Clock source */ + __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- RTC configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ CEC Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + { + /* Check the parameters */ + assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- CLK48 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLSAI when it's used as clock source for CLK48 */ + if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- SDIO Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SPDIFRX Configuration ---------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) + { + /* Check the parameters */ + assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); + + /* Configure the SPDIFRX clock source */ + __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); + /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ + if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- PLLI2S Configuration ------------------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, + I2S on APB2 or SPDIFRX */ + if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + /* Check for PLLI2S/DIVQ parameters */ + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- PLLSAI Configuration -----------------------*/ + /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ + if(pllsaiused == 1U) + { + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) + { + /* check for PLLSAIQ Parameter */ + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + /* check for PLLSAI/DIVQ Parameter */ + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ + /* In Case of PLLI2S is selected as source clock for CLK48 */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Configure the PLLSAI division factors */ + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ + /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ + RCC_PERIPHCLK_SPDIFRX; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + + /* Get the SAI1 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); + + /* Get the SAI2 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CEC clock configuration -----------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ----------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the SPDIFRX clock configuration -------------------------------------*/ + PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock + * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + uint32_t tmpreg1 = 0U; + /* This variable used to store the SAI clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + /* This variable used to store the SAI clock source */ + uint32_t saiclocksource = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_SAI1: + case RCC_PERIPHCLK_SAI2: + { + saiclocksource = RCC->DCKCFGR; + saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); + switch (saiclocksource) + { + case 0U: /* PLLSAI is the clock source for SAI*/ + { + /* Configure the PLLSAI division factor */ + /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); + } + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + /* SAI_CLK_x = PLL_VCO Output/PLLR */ + tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; + frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ + { + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + frequency = (uint32_t)(HSI_VALUE); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + frequency = (uint32_t)(HSE_VALUE); + } + break; + } + default : + { + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC, RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t pllsair = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*--------------------------- CLK48 Configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SDIO Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*------------------- Common configuration SAI/I2S -------------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------- I2S configuration -------------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for these peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + + /*---------------------------- CLK48 configuration ------------------------*/ + /* Configure the PLLSAI when it is used as clock source for CLK48 */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI |\ + RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CLK48 clock configuration -------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t plli2sq = 0U; +#endif /* STM32F413xx || STM32F423xx */ + uint32_t plli2sused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------------------- I2S APB1 configuration ---------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------------- I2S APB2 configuration ---------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*----------------------- SAI1 Block A configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------- SAI1 Block B configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + /*------------------------------------ RTC configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------ TIM configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- FMPI2C1 Configuration --------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- CLK48 Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for CLK48 */ + if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- SDIO Configuration -----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------------------- PLLI2S Configuration --------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or + I2S on APB2*/ + if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + /*-------------------- Set the PLL I2S clock -----------------------------*/ + __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); + + /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Check for PLLI2S/DIVR parameters */ + assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); + + /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); + } +#endif /* STM32F413xx || STM32F423xx */ + + /*----------------- In Case of PLLI2S is just selected ------------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 clock source configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 Audio clock source configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*-------------------- DFSDM2 clock source configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM2 Audio clock source configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ + RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 |\ + RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 |\ + RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; +#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 |\ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 |\ + RCC_PERIPHCLK_DFSDM1_AUDIO; +#endif /* STM32F413xx || STM32F423xx */ + + + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the PLL/PLLI2S division factors -------------------------------------*/ + PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); + PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ---------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the DFSDM1 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); + + /* Get the DFSDM1 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); + +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the DFSDM2 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); + + /* Get the DFSDM2 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); + + /* Get the LPTIM1 clock configuration --------------------------------------*/ + PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); + + /* Get the SAI1 Block Aclock configuration ---------------------------------*/ + PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); + + /* Get the SAI1 Block B clock configuration --------------------------------*/ + PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(I2S..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + + /*---------------------------- I2S Configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); + + /* Configure the I2S clock source */ + __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); + } + + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the I2S clock configuration -----------------------------------------*/ + PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); + + +} +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPBCLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*----------------------- Common configuration SAI/I2S ---------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- I2S configuration -------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SQ , tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for both peripherals */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the PeriphClkInit according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- I2S configuration ---------------------------*/ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); +#if defined(STM32F411xE) + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); +#endif /* STM32F411xE */ + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + +#if defined(STM32F411xE) + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); +#else + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SR); +#endif /* STM32F411xE */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*---------------------------- RTC configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F411xE) + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); +#endif /* STM32F411xE */ + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { +#if defined(STM32F411xE) + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } +#else + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } +#endif /* STM32F411xE */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Select LSE mode + * + * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * + * @param Mode specifies the LSE mode. + * This parameter can be one of the following values: + * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection + * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection + * @retval None + */ +void HAL_RCCEx_SelectLSEMode(uint8_t Mode) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE_MODE(Mode)); + if(Mode == RCC_LSE_HIGHDRIVE_MODE) + { + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } + else + { + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } +} + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions + * @brief Extended Clock management functions + * +@verbatim + =============================================================================== + ##### Extended clock management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the + activation or deactivation of PLLI2S, PLLSAI. +@endverbatim + * @{ + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S. + * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that + * contains the configuration information for the PLLI2S + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); + assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +#if defined(RCC_PLLI2SCFGR_PLLI2SP) + assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) + assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLI2S division factors */ +#if defined(STM32F446xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F411xE) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#else + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#endif /* STM32F446xx */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + + /* Wait till PLLI2S is ready */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLI2S. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) +{ + uint32_t tickstart; + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while(READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI. + * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that + * contains the configuration information for the PLLSAI + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); + assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +#if defined(RCC_PLLSAICFGR_PLLSAIP) + assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#if defined(RCC_PLLSAICFGR_PLLSAIR) + assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLSAI division factors */ +#if defined(STM32F446xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ + PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); +#elif defined(STM32F469xx) || defined(STM32F479xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ + PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#else + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#endif /* STM32F446xx */ + + /* Enable the PLLSAI */ + __HAL_RCC_PLLSAI_ENABLE(); + + /* Wait till PLLSAI is ready */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLSAI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) +{ + uint32_t tickstart; + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(STM32F446xx) +/** + * @brief Returns the SYSCLK frequency + * + * @note This function implementation is valid only for STM32F446xx devices. + * @note This function add the PLL/PLLR System clock source + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U; + uint32_t pllvco = 0U; + uint32_t pllp = 0U; + uint32_t pllr = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); + + sysclockfreq = pllvco/pllp; + break; + } + case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); + + sysclockfreq = pllvco/pllr; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} +#endif /* STM32F446xx */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE, PLL, PLLI2S and PLLSAI OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart; + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Set HSION bit to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSION); + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set HSITRIM[4:0] bits to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Wait till clock switch is ready */ + while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear HSEON, HSEBYP and CSSON bits */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); + + /* Wait till HSE is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear PLLON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); + + /* Wait till PLL is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + +#if defined(RCC_PLLI2S_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLI2SON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); + + /* Wait till PLLI2S is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLSAI bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); + + /* Wait till PLLSAI is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLSAI_SUPPORT */ + + /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; +#else + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ + + /* Reset PLLI2SCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F411xE) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ + + /* Reset PLLSAICFGR register */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; +#elif defined(STM32F446xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + /* Disable all interrupts */ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); + +#if defined(RCC_CIR_PLLI2SRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +#endif /* RCC_CIR_PLLI2SRDYIE */ + +#if defined(RCC_CIR_PLLSAIRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +#endif /* RCC_CIR_PLLSAIRDYIE */ + + /* Clear all interrupt flags */ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC); + +#if defined(RCC_CIR_PLLI2SRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +#endif /* RCC_CIR_PLLI2SRDYC */ + +#if defined(RCC_CIR_PLLSAIRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +#endif /* RCC_CIR_PLLSAIRDYC */ + + /* Clear LSION bit */ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); + + /* Reset all CSR flags */ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; + + /* Adapt Systick interrupt period */ + if(HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @note This function add the PLL/PLLR factor management during PLL configuration this feature + * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#endif /* STM32F446xx */ + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#endif /* STM32F446xx */ + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLM, + RCC_OscInitStruct->PLL.PLLN, + RCC_OscInitStruct->PLL.PLLP, + RCC_OscInitStruct->PLL.PLLQ, + RCC_OscInitStruct->PLL.PLLR); + + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + return HAL_ERROR; + } + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. + * + * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * @note This function add the PLL/PLLR factor management + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); + RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); +} +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c index b98a29ba..eb98d572 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c @@ -1,6654 +1,6654 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + TIM Time Base Initialization - * + TIM Time Base Start - * + TIM Time Base Start Interruption - * + TIM Time Base Start DMA - * + TIM Output Compare/PWM Initialization - * + TIM Output Compare/PWM Channel Configuration - * + TIM Output Compare/PWM Start - * + TIM Output Compare/PWM Start Interruption - * + TIM Output Compare/PWM Start DMA - * + TIM Input Capture Initialization - * + TIM Input Capture Channel Configuration - * + TIM Input Capture Start - * + TIM Input Capture Start Interruption - * + TIM Input Capture Start DMA - * + TIM One Pulse Initialization - * + TIM One Pulse Channel Configuration - * + TIM One Pulse Start - * + TIM Encoder Interface Initialization - * + TIM Encoder Interface Start - * + TIM Encoder Interface Start Interruption - * + TIM Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + TIM OCRef clear configuration - * + TIM External Clock configuration - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to interconnect - several timers together. - (#) Supports incremental encoder for positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - Initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - *** Callback registration *** - ============================================= - - [..] - The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 - allows the user to configure dynamically the driver callbacks. - - [..] - Use Function @ref HAL_TIM_RegisterCallback() to register a callback. - @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, - the Callback ID and a pointer to the user callback function. - - [..] - Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default - weak function. - @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, - and the Callback ID. - - [..] - These functions allow to register/unregister following callbacks: - (+) Base_MspInitCallback : TIM Base Msp Init Callback. - (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. - (+) IC_MspInitCallback : TIM IC Msp Init Callback. - (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. - (+) OC_MspInitCallback : TIM OC Msp Init Callback. - (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. - (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. - (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. - (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. - (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. - (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. - (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. - (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. - (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. - (+) PeriodElapsedCallback : TIM Period Elapsed Callback. - (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. - (+) TriggerCallback : TIM Trigger Callback. - (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. - (+) IC_CaptureCallback : TIM Input Capture Callback. - (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. - (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. - (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. - (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. - (+) ErrorCallback : TIM Error Callback. - (+) CommutationCallback : TIM Commutation Callback. - (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. - (+) BreakCallback : TIM Break Callback. - - [..] -By default, after the Init and when the state is HAL_TIM_STATE_RESET -all interrupt callbacks are set to the corresponding weak functions: - examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). - - [..] - Exception done for MspInit and MspDeInit functions that are reset to the legacy weak - functionalities in the Init / DeInit only when these callbacks are null - (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit - keep and use the user MspInit / MspDeInit callbacks(registered beforehand) - - [..] - Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. - Exception done MspInit / MspDeInit that can be registered / unregistered - in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, - thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. - In that case first register the MspInit/MspDeInit user callbacks - using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. - - [..] - When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or - not defined, the callback registration feature is not available and all callbacks - are set to the corresponding weak functions. - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Base_MspInitCallback == NULL) - { - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Base_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Base_MspDeInitCallback == NULL) - { - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Base_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim TIM Base handle - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief Starts the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Change the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim TIM Base handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * -@verbatim - ============================================================================== - ##### TIM Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the TIM Output Compare. - (+) Stop the TIM Output Compare. - (+) Start the TIM Output Compare and enable interrupt. - (+) Stop the TIM Output Compare and disable interrupt. - (+) Start the TIM Output Compare and enable DMA transfer. - (+) Stop the TIM Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OC_MspInitCallback == NULL) - { - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Output Compare handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OC_MspDeInitCallback == NULL) - { - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim TIM Output Compare handle - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * -@verbatim - ============================================================================== - ##### TIM PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM PWM. - (+) De-initialize the TIM PWM. - (+) Start the TIM PWM. - (+) Stop the TIM PWM. - (+) Start the TIM PWM and enable interrupt. - (+) Stop the TIM PWM and disable interrupt. - (+) Start the TIM PWM and enable DMA transfer. - (+) Stop the TIM PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->PWM_MspInitCallback == NULL) - { - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->PWM_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM PWM handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->PWM_MspDeInitCallback == NULL) - { - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; - } - /* DeInit the low level hardware */ - htim->PWM_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim TIM PWM handle - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim TIM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim TIM PWM handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * -@verbatim - ============================================================================== - ##### TIM Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the TIM Input Capture. - (+) Stop the TIM Input Capture. - (+) Start the TIM Input Capture and enable interrupt. - (+) Stop the TIM Input Capture and disable interrupt. - (+) Start the TIM Input Capture and enable DMA transfer. - (+) Stop the TIM Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->IC_MspInitCallback == NULL) - { - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->IC_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim TIM Input Capture handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->IC_MspDeInitCallback == NULL) - { - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; - } - /* DeInit the low level hardware */ - htim->IC_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture MSP. - * @param htim TIM Input Capture handle - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - break; - } - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((pData == NULL) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - case TIM_CHANNEL_4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - break; - } - - default: - break; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement in DMA mode. - * @param htim TIM Input Capture handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * -@verbatim - ============================================================================== - ##### TIM One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the TIM One Pulse. - (+) Stop the TIM One Pulse. - (+) Start the TIM One Pulse and enable interrupt. - (+) Stop the TIM One Pulse and disable interrupt. - (+) Start the TIM One Pulse and enable DMA transfer. - (+) Stop the TIM One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and initializes the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() - * @param htim TIM One Pulse handle - * @param OnePulseMode Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->OnePulse_MspInitCallback == NULL) - { - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->OnePulse_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim TIM One Pulse handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->OnePulse_MspDeInitCallback == NULL) - { - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; - } - /* DeInit the low level hardware */ - htim->OnePulse_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim TIM One Pulse handle - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be disable - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(OutputChannel); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * -@verbatim - ============================================================================== - ##### TIM Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the TIM Encoder. - (+) Stop the TIM Encoder. - (+) Start the TIM Encoder and enable interrupt. - (+) Stop the TIM Encoder and disable interrupt. - (+) Start the TIM Encoder and enable DMA transfer. - (+) Stop the TIM Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and initialize the associated handle. - * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) - * requires a timer reset to avoid unexpected direction - * due to DIR bit readonly in center aligned mode. - * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() - * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together - * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource - * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa - * @param htim TIM Encoder Interface handle - * @param sConfig TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy weak callbacks */ - TIM_ResetCallback(htim); - - if (htim->Encoder_MspInitCallback == NULL) - { - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->Encoder_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Reset the SMS and ECE bits */ - htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); - tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim TIM Encoder Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->Encoder_MspDeInitCallback == NULL) - { - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; - } - /* DeInit the low level hardware */ - htim->Encoder_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim TIM Encoder Interface handle - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1 The destination Buffer address for IC1. - * @param pData2 The destination Buffer address for IC2. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, - uint32_t *pData2, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - - case TIM_CHANNEL_ALL: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) - { - return HAL_ERROR; - } - - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - default: - break; - } - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim TIM Encoder Interface handle - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if (Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - } - else if (Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim TIM handle - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - /* Capture compare 1 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) - { - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - /* Output compare event */ - else - { -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->OC_DelayElapsedCallback(htim); - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Break input event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->BreakCallback(htim); -#else - HAL_TIMEx_BreakCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM Trigger detection event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } - /* TIM commutation event */ - if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) - { - if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - } -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM Output Compare handle - * @param sConfig TIM Output Compare configuration structure - * @param Channel TIM Channels to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, - TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim TIM IC handle - * @param sConfig TIM Input Capture configuration structure - * @param Channel TIM Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim TIM PWM handle - * @param sConfig TIM PWM configuration structure - * @param Channel TIM Channels to be configured - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, - TIM_OC_InitTypeDef *sConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim TIM One Pulse handle - * @param sConfig TIM One Pulse configuration structure - * @param OutputChannel TIM output channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel TIM input Channel to configure - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @note To output a waveform with a minimum delay user can enable the fast - * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx - * output is forced in response to the edge detection on TIx input, - * without taking in account the comparison. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, - uint32_t OutputChannel, uint32_t InputChannel) -{ - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if (OutputChannel != InputChannel) - { - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - break; - } - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - break; - } - default: - break; - } - - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - break; - } - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, - (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - default: - break; - } - /* configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - break; - } - - if (HAL_OK == status) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim TIM handle - * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read - * This parameter can be one of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @param BurstRequestSrc TIM DMA Request sources - * This parameter can be one of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer The Buffer address. - * @param BurstLength DMA Burst length. This parameter can be one value - * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @note This function should be used only when BurstLength is equal to DMA data transfer length. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, - uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if ((BurstBuffer == NULL) && (BurstLength > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callbacks */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC1: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC2: - { - /* Set the DMA capture/compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC3: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_CC4: - { - /* Set the DMA capture callbacks */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_COM: - { - /* Set the DMA commutation callbacks */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - case TIM_DMA_TRIGGER: - { - /* Set the DMA trigger callbacks */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) - { - return HAL_ERROR; - } - break; - } - default: - break; - } - - /* configure the DMA Burst Mode */ - htim->Instance->DCR = (BurstBaseAddress | BurstLength); - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stop the DMA burst reading - * @param htim TIM handle - * @param BurstRequestSrc TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - HAL_StatusTypeDef status = HAL_OK; - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA stream) */ - switch (BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); - break; - } - case TIM_DMA_CC1: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - case TIM_DMA_CC2: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - case TIM_DMA_CC3: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - case TIM_DMA_CC4: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); - break; - } - case TIM_DMA_COM: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); - break; - } - case TIM_DMA_TRIGGER: - { - status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); - break; - } - default: - break; - } - - if (HAL_OK == status) - { - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - } - - /* Return function status */ - return status; -} - -/** - * @brief Generate a software event - * @param htim TIM handle - * @param EventSource specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note Basic timers can only generate an update event. - * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. - * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances - * supporting a break input. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim TIM handle - * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, - TIM_ClearInputConfigTypeDef *sClearInputConfig, - uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (sClearInputConfig->ClearInputSource) - { - case TIM_CLEARINPUTSOURCE_NONE: - { - /* Clear the OCREF clear selection bit and the the ETR Bits */ - CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); - break; - } - - case TIM_CLEARINPUTSOURCE_ETR: - { - /* Check the parameters */ - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ - if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - break; - } - - default: - break; - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 1 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - else - { - /* Disable the OCREF clear feature for Channel 1 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); - } - break; - } - case TIM_CHANNEL_2: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 2 */ - SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - else - { - /* Disable the OCREF clear feature for Channel 2 */ - CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); - } - break; - } - case TIM_CHANNEL_3: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 3 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - else - { - /* Disable the OCREF clear feature for Channel 3 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); - } - break; - } - case TIM_CHANNEL_4: - { - if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) - { - /* Enable the OCREF clear feature for Channel 4 */ - SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - else - { - /* Disable the OCREF clear feature for Channel 4 */ - CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); - } - break; - } - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the clock source to be used - * @param htim TIM handle - * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig) -{ - uint32_t tmpsmcr; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - break; - } - - case TIM_CLOCKSOURCE_ETRMODE1: - { - /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - break; - } - - case TIM_CLOCKSOURCE_ETRMODE2: - { - /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); - - /* Check ETR input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - break; - } - - case TIM_CLOCKSOURCE_TI1: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - break; - } - - case TIM_CLOCKSOURCE_TI2: - { - /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI2 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - break; - } - - case TIM_CLOCKSOURCE_TI1ED: - { - /* Check whether or not the timer instance supports external clock mode 1 */ - assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); - - /* Check TI1 input conditioning related parameters */ - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - break; - } - - case TIM_CLOCKSOURCE_ITR0: - case TIM_CLOCKSOURCE_ITR1: - case TIM_CLOCKSOURCE_ITR2: - case TIM_CLOCKSOURCE_ITR3: - { - /* Check whether or not the timer instance supports internal trigger input */ - assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); - - TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); - break; - } - - default: - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim TIM handle. - * @param TI1_Selection Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim TIM handle. - * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the Slave mode - * (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) - { - htim->State = HAL_TIM_STATE_READY; - __HAL_UNLOCK(htim); - return HAL_ERROR; - } - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim TIM handle. - * @param Channel TIM Channels to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0U; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - return tmpreg; -} - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) TIM Period elapsed callback - (+) TIM Output Compare callback - (+) TIM Input capture callback - (+) TIM Trigger callback - (+) TIM Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Period elapsed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output Compare callback in non-blocking mode - * @param htim TIM OC handle - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief Input Capture half complete callback in non-blocking mode - * @param htim TIM IC handle - * @retval None - */ -__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Register a User TIM callback to be used instead of the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be registered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @param pCallback pointer to the callback function - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, - pTIM_CallbackTypeDef pCallback) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (pCallback == NULL) - { - return HAL_ERROR; - } - /* Process locked */ - __HAL_LOCK(htim); - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = pCallback; - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = pCallback; - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = pCallback; - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = pCallback; - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = pCallback; - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = pCallback; - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = pCallback; - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = pCallback; - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = pCallback; - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = pCallback; - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = pCallback; - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = pCallback; - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = pCallback; - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = pCallback; - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = pCallback; - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = pCallback; - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return status; -} - -/** - * @brief Unregister a TIM callback - * TIM callback is redirected to the weak predefined callback - * @param htim tim handle - * @param CallbackID ID of the callback to be unregistered - * This parameter can be one of the following values: - * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID - * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID - * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID - * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID - * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID - * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID - * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID - * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID - * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID - * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID - * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID - * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID - * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID - * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID - * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID - * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID - * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID - * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID - * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID - * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID - * @retval status - */ -HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process locked */ - __HAL_LOCK(htim); - - if (htim->State == HAL_TIM_STATE_READY) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ - break; - - case HAL_TIM_PERIOD_ELAPSED_CB_ID : - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak Period Elapsed Callback */ - break; - - case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak Period Elapsed half complete Callback */ - break; - - case HAL_TIM_TRIGGER_CB_ID : - htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak Trigger Callback */ - break; - - case HAL_TIM_TRIGGER_HALF_CB_ID : - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak Trigger half complete Callback */ - break; - - case HAL_TIM_IC_CAPTURE_CB_ID : - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC Capture Callback */ - break; - - case HAL_TIM_IC_CAPTURE_HALF_CB_ID : - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC Capture half complete Callback */ - break; - - case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC Delay Elapsed Callback */ - break; - - case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM Pulse Finished Callback */ - break; - - case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM Pulse Finished half complete Callback */ - break; - - case HAL_TIM_ERROR_CB_ID : - htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak Error Callback */ - break; - - case HAL_TIM_COMMUTATION_CB_ID : - htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak Commutation Callback */ - break; - - case HAL_TIM_COMMUTATION_HALF_CB_ID : - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak Commutation half complete Callback */ - break; - - case HAL_TIM_BREAK_CB_ID : - htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak Break Callback */ - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else if (htim->State == HAL_TIM_STATE_RESET) - { - switch (CallbackID) - { - case HAL_TIM_BASE_MSPINIT_CB_ID : - htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ - break; - - case HAL_TIM_BASE_MSPDEINIT_CB_ID : - htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ - break; - - case HAL_TIM_IC_MSPINIT_CB_ID : - htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ - break; - - case HAL_TIM_IC_MSPDEINIT_CB_ID : - htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ - break; - - case HAL_TIM_OC_MSPINIT_CB_ID : - htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ - break; - - case HAL_TIM_OC_MSPDEINIT_CB_ID : - htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ - break; - - case HAL_TIM_PWM_MSPINIT_CB_ID : - htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ - break; - - case HAL_TIM_PWM_MSPDEINIT_CB_ID : - htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : - htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ - break; - - case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : - htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ - break; - - case HAL_TIM_ENCODER_MSPINIT_CB_ID : - htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ - break; - - case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : - htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ - break; - - case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ - break; - - default : - /* Return error status */ - status = HAL_ERROR; - break; - } - } - else - { - /* Return error status */ - status = HAL_ERROR; - } - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return status; -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base handle state. - * @param htim TIM Base handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC handle state. - * @param htim TIM Output Compare handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM handle state. - * @param htim TIM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture handle state. - * @param htim TIM IC handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode handle state. - * @param htim TIM OPM handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode handle state. - * @param htim TIM Encoder Interface handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @brief TIM DMA error callback - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->ErrorCallback(htim); -#else - HAL_TIM_ErrorCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Delay Pulse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PWM_PulseFinishedHalfCpltCallback(htim); -#else - HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureCallback(htim); -#else - HAL_TIM_IC_CaptureCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Capture half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - - if (hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - else - { - /* nothing to do */ - } - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->IC_CaptureHalfCpltCallback(htim); -#else - HAL_TIM_IC_CaptureHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedCallback(htim); -#else - HAL_TIM_PeriodElapsedCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Period Elapse half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->PeriodElapsedHalfCpltCallback(htim); -#else - HAL_TIM_PeriodElapsedHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerCallback(htim); -#else - HAL_TIM_TriggerCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Trigger half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->TriggerHalfCpltCallback(htim); -#else - HAL_TIM_TriggerHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief Time Base configuration - * @param TIMx TIM peripheral - * @param Structure TIM Base configuration structure - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - /* Set the auto-reload preload */ - MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = Structure->Prescaler; - - if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter (only for advanced timer) value immediately */ - TIMx->EGR = TIM_EGR_UG; -} - -/** - * @brief Timer Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) - { - /* Check parameters */ - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8U); - - if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8U); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - } - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4U); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Timer Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config The ouput configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx; - uint32_t tmpccer; - uint32_t tmpcr2; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8U); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12U); - - if (IS_TIM_BREAK_INSTANCE(TIMx)) - { - /* Check parameters */ - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6U); - } - - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Slave Timer configuration function - * @param htim TIM handle - * @param sSlaveConfig Slave timer configuration - * @retval None - */ -static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) -{ - uint32_t tmpsmcr; - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - if(sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) - { - return HAL_ERROR; - } - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - break; - } - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - break; - } - - case TIM_TS_ITR0: - case TIM_TS_ITR1: - case TIM_TS_ITR2: - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - break; - } - - default: - break; - } - return HAL_OK; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 - * (on channel2 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4U); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 - * (on channel1 path) is used as the input signal. Therefore CCMR1 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1; - uint32_t tmpccer; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12U); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4U); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPOLARITY_RISING - * @arg TIM_ICPOLARITY_FALLING - * @arg TIM_ICPOLARITY_BOTHEDGE - * @param TIM_ICSelection specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 - * (on channel1 path) is used as the input signal. Therefore CCMR2 must be - * protected against un-initialized filter and polarity values. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2; - uint32_t tmpccer; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8U); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param InputTriggerSource The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) -{ - uint32_t tmpsmcr; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. - * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. - * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. - * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. - * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. - * @param ExtTRGFilter External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @arg TIM_CHANNEL_4: TIM Channel 4 - * @param ChannelState specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -/** - * @brief Reset interrupt callbacks to the legacy weak callbacks. - * @param htim pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void TIM_ResetCallback(TIM_HandleTypeDef *htim) -{ - /* Reset the TIM callback to the legacy weak callbacks */ - htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak PeriodElapsedCallback */ - htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak PeriodElapsedHalfCpltCallback */ - htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak TriggerCallback */ - htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak TriggerHalfCpltCallback */ - htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC_CaptureCallback */ - htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC_CaptureHalfCpltCallback */ - htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC_DelayElapsedCallback */ - htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM_PulseFinishedCallback */ - htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM_PulseFinishedHalfCpltCallback */ - htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak ErrorCallback */ - htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak CommutationCallback */ - htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak CommutationHalfCpltCallback */ - htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak BreakCallback */ -} -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function @ref HAL_TIM_RegisterCallback() to register a callback. + @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, + the Callback ID and a pointer to the user callback function. + + [..] + Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default + weak function. + @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + + [..] + These functions allow to register/unregister following callbacks: + (+) Base_MspInitCallback : TIM Base Msp Init Callback. + (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. + (+) IC_MspInitCallback : TIM IC Msp Init Callback. + (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. + (+) OC_MspInitCallback : TIM OC Msp Init Callback. + (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. + (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. + (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. + (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. + (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. + (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. + (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. + (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. + (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. + (+) PeriodElapsedCallback : TIM Period Elapsed Callback. + (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. + (+) TriggerCallback : TIM Trigger Callback. + (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. + (+) IC_CaptureCallback : TIM Input Capture Callback. + (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. + (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. + (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. + (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. + (+) ErrorCallback : TIM Error Callback. + (+) CommutationCallback : TIM Commutation Callback. + (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. + (+) BreakCallback : TIM Break Callback. + + [..] +By default, after the Init and when the state is HAL_TIM_STATE_RESET +all interrupt callbacks are set to the corresponding weak functions: + examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + + [..] + Exception done for MspInit and MspDeInit functions that are reset to the legacy weak + functionalities in the Init / DeInit only when these callbacks are null + (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit + keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + + [..] + Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. + Exception done MspInit / MspDeInit that can be registered / unregistered + in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, + thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + + [..] + When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIM TIM + * @brief TIM HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup TIM_Private_Functions + * @{ + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig); +/** + * @} + */ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * +@verbatim + ============================================================================== + ##### Time Base functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM base. + (+) De-initialize the TIM base. + (+) Start the Time Base. + (+) Stop the Time Base. + (+) Start the Time Base and enable interrupt. + (+) Stop the Time Base and disable interrupt. + (+) Start the Time Base and enable DMA transfer. + (+) Stop the Time Base and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Time base Unit according to the specified + * parameters in the TIM_HandleTypeDef and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Base_MspInitCallback == NULL) + { + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Base_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the Time Base configuration */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Base peripheral + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Base_MspDeInitCallback == NULL) + { + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Base_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspDeInit could be implemented in the user file + */ +} + + +/** + * @brief Starts the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Change the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Enable the TIM Update interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + /* Disable the TIM Update interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * +@verbatim + ============================================================================== + ##### TIM Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Output Compare. + (+) De-initialize the TIM Output Compare. + (+) Start the TIM Output Compare. + (+) Stop the TIM Output Compare. + (+) Start the TIM Output Compare and enable interrupt. + (+) Stop the TIM Output Compare and disable interrupt. + (+) Start the TIM Output Compare and enable DMA transfer. + (+) Stop the TIM Output Compare and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Output Compare according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OC_MspInitCallback == NULL) + { + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the Output Compare */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OC_MspDeInitCallback == NULL) + { + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * +@verbatim + ============================================================================== + ##### TIM PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM PWM. + (+) De-initialize the TIM PWM. + (+) Start the TIM PWM. + (+) Stop the TIM PWM. + (+) Start the TIM PWM and enable interrupt. + (+) Stop the TIM PWM and disable interrupt. + (+) Start the TIM PWM and enable DMA transfer. + (+) Stop the TIM PWM and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM PWM Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->PWM_MspInitCallback == NULL) + { + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->PWM_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the PWM */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->PWM_MspDeInitCallback == NULL) + { + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + } + /* DeInit the low level hardware */ + htim->PWM_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the PWM signal generation. + * @param htim TIM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Capture/Compare 3 request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * +@verbatim + ============================================================================== + ##### TIM Input Capture functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Input Capture. + (+) De-initialize the TIM Input Capture. + (+) Start the TIM Input Capture. + (+) Stop the TIM Input Capture. + (+) Start the TIM Input Capture and enable interrupt. + (+) Stop the TIM Input Capture and disable interrupt. + (+) Start the TIM Input Capture and enable DMA transfer. + (+) Stop the TIM Input Capture and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Input Capture Time base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->IC_MspInitCallback == NULL) + { + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->IC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the input capture */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->IC_MspDeInitCallback == NULL) + { + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->IC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture MSP. + * @param htim TIM Input Capture handle + * @retval None + */ +__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Input Capture MSP. + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + break; + } + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + break; + } + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + break; + } + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * +@verbatim + ============================================================================== + ##### TIM One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM One Pulse. + (+) De-initialize the TIM One Pulse. + (+) Start the TIM One Pulse. + (+) Stop the TIM One Pulse. + (+) Start the TIM One Pulse and enable interrupt. + (+) Stop the TIM One Pulse and disable interrupt. + (+) Start the TIM One Pulse and enable DMA transfer. + (+) Stop the TIM One Pulse and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM One Pulse Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() + * @param htim TIM One Pulse handle + * @param OnePulseMode Select the One pulse mode. + * This parameter can be one of the following values: + * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. + * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_OPM_MODE(OnePulseMode)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OnePulse_MspInitCallback == NULL) + { + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OnePulse_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OnePulse_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the One Pulse Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Reset the OPM Bit */ + htim->Instance->CR1 &= ~TIM_CR1_OPM; + + /* Configure the OPM Mode */ + htim->Instance->CR1 |= OnePulseMode; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM One Pulse + * @param htim TIM One Pulse handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OnePulse_MspDeInitCallback == NULL) + { + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OnePulse_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_OnePulse_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM One Pulse signal generation. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * +@verbatim + ============================================================================== + ##### TIM Encoder functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Encoder. + (+) De-initialize the TIM Encoder. + (+) Start the TIM Encoder. + (+) Stop the TIM Encoder. + (+) Start the TIM Encoder and enable interrupt. + (+) Stop the TIM Encoder and disable interrupt. + (+) Start the TIM Encoder and enable DMA transfer. + (+) Stop the TIM Encoder and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Encoder Interface and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() + * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together + * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource + * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa + * @param htim TIM Encoder Interface handle + * @param sConfig TIM Encoder Interface configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Encoder_MspInitCallback == NULL) + { + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Encoder_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_Encoder_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Reset the SMS and ECE bits */ + htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = htim->Instance->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = htim->Instance->CCER; + + /* Set the encoder Mode */ + tmpsmcr |= sConfig->EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); + tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); + + /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ + tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); + tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); + tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); + tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); + tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); + tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + htim->Instance->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + htim->Instance->CCER = tmpccer; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief DeInitializes the TIM Encoder interface + * @param htim TIM Encoder Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Encoder_MspDeInitCallback == NULL) + { + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Encoder_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Encoder_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Enable the encoder interface channels */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Enable the encoder interface channels */ + /* Enable the capture compare Interrupts 1 and/or 2 */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + } + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 and 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @param pData1 The destination Buffer address for IC1. + * @param pData2 The destination Buffer address for IC2. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_ALL: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK) + { + return HAL_ERROR; + } + + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + default: + break; + } + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 and 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ +/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief TIM IRQ handler management + * +@verbatim + ============================================================================== + ##### IRQ handler management ##### + ============================================================================== + [..] + This section provides Timer IRQ handler function. + +@endverbatim + * @{ + */ +/** + * @brief This function handles TIM interrupts requests. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + /* Capture compare 1 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) + { + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + } + /* Capture compare 2 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 3 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 4 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* TIM Update event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Break input event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->BreakCallback(htim); +#else + HAL_TIMEx_BreakCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Trigger detection event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM commutation event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief TIM Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. + (+) Configure External Clock source. + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master and the Slave synchronization. + (+) Configure the DMA Burst Mode. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIM Output Compare Channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM Output Compare handle + * @param sConfig TIM Output Compare configuration structure + * @param Channel TIM Channels to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, + TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 1 in Output Compare */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 2 in Output Compare */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 3 in Output Compare */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 4 in Output Compare */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture Channels according to the specified + * parameters in the TIM_IC_InitTypeDef. + * @param htim TIM IC handle + * @param sConfig TIM Input Capture configuration structure + * @param Channel TIM Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (Channel == TIM_CHANNEL_1) + { + /* TI1 Configuration */ + TIM_TI1_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Set the IC2PSC value */ + htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); + } + else if (Channel == TIM_CHANNEL_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + TIM_TI3_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC3PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; + + /* Set the IC3PSC value */ + htim->Instance->CCMR2 |= sConfig->ICPrescaler; + } + else + { + /* TI4 Configuration */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + TIM_TI4_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC4PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; + + /* Set the IC4PSC value */ + htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM PWM handle + * @param sConfig TIM PWM configuration structure + * @param Channel TIM Channels to be configured + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, + TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the Channel 1 in PWM mode */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel1 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the Channel 2 in PWM mode */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel2 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the Channel 3 in PWM mode */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel3 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the Channel 4 in PWM mode */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel4 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse Channels according to the specified + * parameters in the TIM_OnePulse_InitTypeDef. + * @param htim TIM One Pulse handle + * @param sConfig TIM One Pulse configuration structure + * @param OutputChannel TIM output channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @param InputChannel TIM input Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) +{ + TIM_OC_InitTypeDef temp1; + + /* Check the parameters */ + assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); + assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); + + if (OutputChannel != InputChannel) + { + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Extract the Output compare configuration from sConfig structure */ + temp1.OCMode = sConfig->OCMode; + temp1.Pulse = sConfig->Pulse; + temp1.OCPolarity = sConfig->OCPolarity; + temp1.OCNPolarity = sConfig->OCNPolarity; + temp1.OCIdleState = sConfig->OCIdleState; + temp1.OCNIdleState = sConfig->OCNIdleState; + + switch (OutputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_OC1_SetConfig(htim->Instance, &temp1); + break; + } + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_OC2_SetConfig(htim->Instance, &temp1); + break; + } + default: + break; + } + + switch (InputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1FP1; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI2FP2; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, + uint32_t *BurstBuffer, uint32_t BurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + default: + break; + } + /* configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM DMA Burst mode + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + break; + } + + if (HAL_OK == status) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA capture/compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK) + { + return HAL_ERROR; + } + break; + } + default: + break; + } + + /* configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stop the DMA burst reading + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + break; + } + + if (HAL_OK == status) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Generate a software event + * @param htim TIM handle + * @param EventSource specifies the event source. + * This parameter can be one of the following values: + * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source + * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EVENTSOURCE_COM: Timer COM event source + * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source + * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source + * @note Basic timers can only generate an update event. + * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. + * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances + * supporting a break input. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_EVENT_SOURCE(EventSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the event sources */ + htim->Instance->EGR = EventSource; + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Configures the OCRef clear feature + * @param htim TIM handle + * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that + * contains the OCREF clear feature and parameters for the TIM peripheral. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (sClearInputConfig->ClearInputSource) + { + case TIM_CLEARINPUTSOURCE_NONE: + { + /* Clear the OCREF clear selection bit and the the ETR Bits */ + CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); + break; + } + + case TIM_CLEARINPUTSOURCE_ETR: + { + /* Check the parameters */ + assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); + assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); + assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); + + /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + TIM_ETR_SetConfig(htim->Instance, + sClearInputConfig->ClearInputPrescaler, + sClearInputConfig->ClearInputPolarity, + sClearInputConfig->ClearInputFilter); + break; + } + + default: + break; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 1 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + else + { + /* Disable the OCREF clear feature for Channel 1 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + break; + } + case TIM_CHANNEL_2: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 2 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + else + { + /* Disable the OCREF clear feature for Channel 2 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + break; + } + case TIM_CHANNEL_3: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 3 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + else + { + /* Disable the OCREF clear feature for Channel 3 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + break; + } + case TIM_CHANNEL_4: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 4 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + else + { + /* Disable the OCREF clear feature for Channel 4 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + break; + } + default: + break; + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the clock source to be used + * @param htim TIM handle + * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that + * contains the clock source information for the TIM peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig) +{ + uint32_t tmpsmcr; + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); + + /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + htim->Instance->SMCR = tmpsmcr; + + switch (sClockSourceConfig->ClockSource) + { + case TIM_CLOCKSOURCE_INTERNAL: + { + assert_param(IS_TIM_INSTANCE(htim->Instance)); + break; + } + + case TIM_CLOCKSOURCE_ETRMODE1: + { + /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + /* Select the External clock mode1 and the ETRF trigger */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + break; + } + + case TIM_CLOCKSOURCE_ETRMODE2: + { + /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= TIM_SMCR_ECE; + break; + } + + case TIM_CLOCKSOURCE_TI1: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); + break; + } + + case TIM_CLOCKSOURCE_TI2: + { + /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI2 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); + break; + } + + case TIM_CLOCKSOURCE_TI1ED: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); + break; + } + + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + { + /* Check whether or not the timer instance supports internal trigger input */ + assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); + + TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); + break; + } + + default: + break; + } + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Selects the signal connected to the TI1 input: direct from CH1_input + * or a XOR combination between CH1_input, CH2_input & CH3_input + * @param htim TIM handle. + * @param TI1_Selection Indicate whether or not channel 1 is connected to the + * output of a XOR gate. + * This parameter can be one of the following values: + * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input + * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 + * pins are connected to the TI1 input (XOR combination) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) +{ + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Reset the TI1 selection */ + tmpcr2 &= ~TIM_CR2_TI1S; + + /* Set the TI1 selection */ + tmpcr2 |= TI1_Selection; + + /* Write to TIMxCR2 */ + htim->Instance->CR2 = tmpcr2; + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Disable Trigger Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode in interrupt mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Enable Trigger Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Read the captured value from Capture Compare unit + * @param htim TIM handle. + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval Captured value + */ +uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpreg = 0U; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Return the capture 1 value */ + tmpreg = htim->Instance->CCR1; + + break; + } + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Return the capture 2 value */ + tmpreg = htim->Instance->CCR2; + + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Return the capture 3 value */ + tmpreg = htim->Instance->CCR3; + + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Return the capture 4 value */ + tmpreg = htim->Instance->CCR4; + + break; + } + + default: + break; + } + + return tmpreg; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * +@verbatim + ============================================================================== + ##### TIM Callbacks functions ##### + ============================================================================== + [..] + This section provides TIM callback functions: + (+) TIM Period elapsed callback + (+) TIM Output Compare callback + (+) TIM Input capture callback + (+) TIM Trigger callback + (+) TIM Error callback + +@endverbatim + * @{ + */ + +/** + * @brief Period elapsed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Period elapsed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim TIM OC handle + * @retval None + */ +__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture half complete callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Timer error callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_ErrorCallback could be implemented in the user file + */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User TIM callback to be used instead of the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @param pCallback pointer to the callback function + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = pCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = pCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Unregister a TIM callback + * TIM callback is redirected to the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak Period Elapsed Callback */ + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak Period Elapsed half complete Callback */ + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak Trigger Callback */ + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak Trigger half complete Callback */ + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC Capture Callback */ + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC Capture half complete Callback */ + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC Delay Elapsed Callback */ + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM Pulse Finished Callback */ + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM Pulse Finished half complete Callback */ + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak Error Callback */ + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak Commutation Callback */ + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak Commutation half complete Callback */ + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak Break Callback */ + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; /* Legacy weak Base MspInit Callback */ + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; /* Legacy weak Base Msp DeInit Callback */ + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; /* Legacy weak IC Msp Init Callback */ + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; /* Legacy weak IC Msp DeInit Callback */ + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; /* Legacy weak OC Msp Init Callback */ + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; /* Legacy weak OC Msp DeInit Callback */ + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; /* Legacy weak PWM Msp Init Callback */ + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; /* Legacy weak PWM Msp DeInit Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; /* Legacy weak One Pulse Msp Init Callback */ + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; /* Legacy weak One Pulse Msp DeInit Callback */ + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; /* Legacy weak Encoder Msp Init Callback */ + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; /* Legacy weak Encoder Msp DeInit Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; /* Legacy weak Hall Sensor Msp Init Callback */ + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; /* Legacy weak Hall Sensor Msp DeInit Callback */ + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief TIM Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Base handle state. + * @param htim TIM Base handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM OC handle state. + * @param htim TIM Output Compare handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM PWM handle state. + * @param htim TIM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Input Capture handle state. + * @param htim TIM IC handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM One Pulse Mode handle state. + * @param htim TIM OPM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM Encoder Interface handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ + +/** + * @brief TIM DMA error callback + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMAError(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Delay Pulse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedHalfCpltCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureHalfCpltCallback(htim); +#else + HAL_TIM_IC_CaptureHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Period Elapse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Period Elapse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedHalfCpltCallback(htim); +#else + HAL_TIM_PeriodElapsedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerHalfCpltCallback(htim); +#else + HAL_TIM_TriggerHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief Time Base configuration + * @param TIMx TIM peripheral + * @param Structure TIM Base configuration structure + * @retval None + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure) +{ + uint32_t tmpcr1; + tmpcr1 = TIMx->CR1; + + /* Set TIM Time Base Unit parameters ---------------------------------------*/ + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); + tmpcr1 |= Structure->CounterMode; + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + tmpcr1 &= ~TIM_CR1_CKD; + tmpcr1 |= (uint32_t)Structure->ClockDivision; + } + + /* Set the auto-reload preload */ + MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); + + TIMx->CR1 = tmpcr1; + + /* Set the Autoreload value */ + TIMx->ARR = (uint32_t)Structure->Period ; + + /* Set the Prescaler value */ + TIMx->PSC = Structure->Prescaler; + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = Structure->RepetitionCounter; + } + + /* Generate an update event to reload the Prescaler + and the repetition counter (only for advanced timer) value immediately */ + TIMx->EGR = TIM_EGR_UG; +} + +/** + * @brief Timer Output Compare 1 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~TIM_CCMR1_OC1M; + tmpccmrx &= ~TIM_CCMR1_CC1S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC1P; + /* Set the Output Compare Polarity */ + tmpccer |= OC_Config->OCPolarity; + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) + { + /* Check parameters */ + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC1NP; + /* Set the Output N Polarity */ + tmpccer |= OC_Config->OCNPolarity; + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC1NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS1; + tmpcr2 &= ~TIM_CR2_OIS1N; + /* Set the Output Idle state */ + tmpcr2 |= OC_Config->OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= OC_Config->OCNIdleState; + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 2 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR1_OC2M; + tmpccmrx &= ~TIM_CCMR1_CC2S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC2P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 4U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC2NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 4U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC2NE; + + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS2; + tmpcr2 &= ~TIM_CR2_OIS2N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 2U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 2U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 3 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 3: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC3M; + tmpccmrx &= ~TIM_CCMR2_CC3S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC3P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 8U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC3NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 8U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC3NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS3; + tmpcr2 &= ~TIM_CR2_OIS3N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 4U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 4U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 4 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The ouput configuration structure + * @retval None + */ +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC4M; + tmpccmrx &= ~TIM_CCMR2_CC4S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC4P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS4; + + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Slave Timer configuration function + * @param htim TIM handle + * @param sSlaveConfig Slave timer configuration + * @retval None + */ +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the Trigger Selection Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source */ + tmpsmcr |= sSlaveConfig->InputTrigger; + + /* Reset the slave mode Bits */ + tmpsmcr &= ~TIM_SMCR_SMS; + /* Set the slave mode */ + tmpsmcr |= sSlaveConfig->SlaveMode; + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Configure the trigger prescaler, filter, and polarity */ + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_ETRF: + { + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + /* Configure the ETR Trigger source */ + TIM_ETR_SetConfig(htim->Instance, + sSlaveConfig->TriggerPrescaler, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI1F_ED: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + if(sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) + { + return HAL_ERROR; + } + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = htim->Instance->CCER; + htim->Instance->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = htim->Instance->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + htim->Instance->CCMR1 = tmpccmr1; + htim->Instance->CCER = tmpccer; + break; + } + + case TIM_TS_TI1FP1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI1 Filter and Polarity */ + TIM_TI1_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI2FP2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI2 Filter and Polarity */ + TIM_TI2_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + { + /* Check the parameter */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + break; + } + + default: + break; + } + return HAL_OK; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 + * (on channel2 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) + { + tmpccmr1 &= ~TIM_CCMR1_CC1S; + tmpccmr1 |= TIM_ICSelection; + } + else + { + tmpccmr1 |= TIM_CCMR1_CC1S_0; + } + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI1. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= (TIM_ICFilter << 4U); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= TIM_ICPolarity; + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 + * (on channel1 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr1 &= ~TIM_CCMR1_CC2S; + tmpccmr1 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI2. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= (TIM_ICFilter << 12U); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (TIM_ICPolarity << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC3S; + tmpccmr2 |= TIM_ICSelection; + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC3F; + tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); + + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); + tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + * @retval None + */ +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC4S; + tmpccmr2 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC4F; + tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); + tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx to select the TIM peripheral + * @param InputTriggerSource The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) +{ + uint32_t tmpsmcr; + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source and the slave mode*/ + tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx to select the TIM peripheral + * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. + * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. + * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. + * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. + * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. + * @param ExtTRGFilter External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmcr; + + tmpsmcr = TIMx->SMCR; + + /* Reset the ETR Bits */ + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @param ChannelState specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. + * @retval None + */ +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_TIM_CHANNELS(Channel)); + + tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Reset interrupt callbacks to the legacy weak callbacks. + * @param htim pointer to a TIM_HandleTypeDef structure that contains + * the configuration information for TIM module. + * @retval None + */ +void TIM_ResetCallback(TIM_HandleTypeDef *htim) +{ + /* Reset the TIM callback to the legacy weak callbacks */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; /* Legacy weak PeriodElapsedCallback */ + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; /* Legacy weak PeriodElapsedHalfCpltCallback */ + htim->TriggerCallback = HAL_TIM_TriggerCallback; /* Legacy weak TriggerCallback */ + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; /* Legacy weak TriggerHalfCpltCallback */ + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; /* Legacy weak IC_CaptureCallback */ + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; /* Legacy weak IC_CaptureHalfCpltCallback */ + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; /* Legacy weak OC_DelayElapsedCallback */ + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; /* Legacy weak PWM_PulseFinishedCallback */ + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM_PulseFinishedHalfCpltCallback */ + htim->ErrorCallback = HAL_TIM_ErrorCallback; /* Legacy weak ErrorCallback */ + htim->CommutationCallback = HAL_TIMEx_CommutCallback; /* Legacy weak CommutationCallback */ + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; /* Legacy weak CommutationHalfCpltCallback */ + htim->BreakCallback = HAL_TIMEx_BreakCallback; /* Legacy weak BreakCallback */ +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c similarity index 97% rename from com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c rename to itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c index 7988a786..99a13c0f 100644 --- a/com.yakindu.sct.examples.stm32f407vg.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ b/itemis.create.examples.stm32f407vg.multism.blinky/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c @@ -1,1978 +1,1978 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_tim_ex.c - * @author MCD Application Team - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer Extended peripheral: - * + Time Hall Sensor Interface Initialization - * + Time Hall Sensor Interface Start - * + Time Complementary signal break and dead time configuration - * + Time Master and Slave synchronization configuration - * + Timer remapping capabilities configuration - @verbatim - ============================================================================== - ##### TIMER Extended features ##### - ============================================================================== - [..] - The Timer Extended features include: - (#) Complementary outputs with programmable dead-time for : - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - (#) Synchronization circuit to control the timer with external signals and to - interconnect several timers together. - (#) Break input to put the timer output signals in reset state or in a known state. - (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for - positioning purposes - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending on the selected feature: - (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the - Timer Hall Sensor Interface and the commutation event with the corresponding - Interrupt and DMA request if needed (Note that One Timer is used to interface - with the Hall sensor Interface and another Timer should be used to use - the commutation event). - - (#) Activate the TIM peripheral using one of the start functions: - (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT() - (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT() - (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() - (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT(). - - @endverbatim - ****************************************************************************** - * @attention - * - *

    © Copyright (c) 2016 STMicroelectronics. - * All rights reserved.

    - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" - -/** @addtogroup STM32F4xx_HAL_Driver - * @{ - */ - -/** @defgroup TIMEx TIMEx - * @brief TIM Extended HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions - * @{ - */ - -/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * -@verbatim - ============================================================================== - ##### Timer Hall Sensor functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure TIM HAL Sensor. - (+) De-initialize TIM HAL Sensor. - (+) Start the Hall Sensor Interface. - (+) Stop the Hall Sensor Interface. - (+) Start the Hall Sensor Interface and enable interrupts. - (+) Stop the Hall Sensor Interface and disable interrupts. - (+) Start the Hall Sensor Interface and enable DMA transfers. - (+) Stop the Hall Sensor Interface and disable DMA transfers. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. - * @param htim TIM Hall Sensor Interface handle - * @param sConfig TIM Hall Sensor configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig) -{ - TIM_OC_InitTypeDef OC_Config; - - /* Check the TIM handle allocation */ - if (htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - - if (htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - /* Reset interrupt callbacks to legacy week callbacks */ - TIM_ResetCallback(htim); - - if (htim->HallSensor_MspInitCallback == NULL) - { - htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; - } - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - htim->HallSensor_MspInitCallback(htim); -#else - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIMEx_HallSensor_MspInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - } - - /* Set the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ - TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->IC1Prescaler; - - /* Enable the Hall sensor interface (XOR function of the three inputs) */ - htim->Instance->CR2 |= TIM_CR2_TI1S; - - /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1F_ED; - - /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; - - /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ - OC_Config.OCFastMode = TIM_OCFAST_DISABLE; - OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; - OC_Config.OCMode = TIM_OCMODE_PWM2; - OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; - OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; - OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; - OC_Config.Pulse = sConfig->Commutation_Delay; - - TIM_OC2_SetConfig(htim->Instance, &OC_Config); - - /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 - register to 101 */ - htim->Instance->CR2 &= ~TIM_CR2_MMS; - htim->Instance->CR2 |= TIM_TRGO_OC2REF; - - /* Initialize the TIM state*/ - htim->State = HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Hall Sensor interface - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - if (htim->HallSensor_MspDeInitCallback == NULL) - { - htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; - } - /* DeInit the low level hardware */ - htim->HallSensor_MspDeInitCallback(htim); -#else - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIMEx_HallSensor_MspDeInit(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Hall Sensor MSP. - * @param htim TIM Hall Sensor Interface handle - * @retval None - */ -__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Hall Sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall sensor Interface. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1, 2 and 3 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Enable the capture compare Interrupts 1 event */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in interrupt mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts event */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @param pData The destination Buffer address. - * @param Length The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - /* Enable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - - /* Set the DMA Input Capture 1 Callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream for Capture 1*/ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the capture compare 1 Interrupt */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Hall Sensor Interface in DMA mode. - * @param htim TIM Hall Sensor Interface handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channel 1 - (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - - /* Disable the capture compare Interrupts 1 event */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * -@verbatim - ============================================================================== - ##### Timer Complementary Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary Output Compare/PWM. - (+) Stop the Complementary Output Compare/PWM. - (+) Start the Complementary Output Compare/PWM and enable interrupts. - (+) Stop the Complementary Output Compare/PWM and disable interrupts. - (+) Start the Complementary Output Compare/PWM and enable DMA transfers. - (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation on the complementary - * output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM OC handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Output Compare interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - - default: - break; - } - - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpccer; - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Output Compare DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - break; - } - - /* Enable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode - * on the complementary output. - * @param htim TIM Output Compare handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Output Compare DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - break; - } - - /* Disable the Capture compare channel N */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * -@verbatim - ============================================================================== - ##### Timer Complementary PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary PWM. - (+) Stop the Complementary PWM. - (+) Start the Complementary PWM and enable interrupts. - (+) Stop the Complementary PWM and disable interrupts. - (+) Start the Complementary PWM and enable DMA transfers. - (+) Stop the Complementary PWM and disable DMA transfers. - (+) Start the Complementary Input Capture measurement. - (+) Stop the Complementary Input Capture. - (+) Start the Complementary Input Capture and enable interrupts. - (+) Stop the Complementary Input Capture and disable interrupts. - (+) Start the Complementary Input Capture and enable DMA transfers. - (+) Stop the Complementary Input Capture and disable DMA transfers. - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation on the complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Enable the TIM Break interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode on the - * complementary output. - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpccer; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - break; - } - - default: - break; - } - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the TIM Break interrupt (only if no more channel is active) */ - tmpccer = htim->Instance->CCER; - if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) - { - __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); - } - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode on the - * complementary output - * @param htim TIM handle - * @param Channel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @param pData The source Buffer address. - * @param Length The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - if (htim->State == HAL_TIM_STATE_BUSY) - { - return HAL_BUSY; - } - else if (htim->State == HAL_TIM_STATE_READY) - { - if (((uint32_t)pData == 0U) && (Length > 0U)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - else - { - /* nothing to do */ - } - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - break; - } - - case TIM_CHANNEL_2: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - break; - } - - case TIM_CHANNEL_3: - { - /* Set the DMA compare callbacks */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) - { - return HAL_ERROR; - } - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - break; - } - - default: - break; - } - - /* Enable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ - tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; - if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) - { - __HAL_TIM_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode on the complementary - * output - * @param htim TIM handle - * @param Channel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); - break; - } - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); - break; - } - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); - break; - } - - default: - break; - } - - /* Disable the complementary PWM output */ - TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * -@verbatim - ============================================================================== - ##### Timer Complementary One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the Complementary One Pulse generation. - (+) Stop the Complementary One Pulse. - (+) Start the Complementary One Pulse and enable interrupts. - (+) Stop the Complementary One Pulse and disable interrupts. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the TIM One Pulse signal generation on the complementary - * output. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Enable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation on the complementary - * output. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be enabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - /* Enable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); - - /* Enable the Main Output */ - __HAL_TIM_MOE_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode on the - * complementary channel. - * @param htim TIM One Pulse handle - * @param OutputChannel TIM Channel to be disabled - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); - - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the complementary One Pulse output */ - TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); - - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure the commutation event in case of use of the Hall sensor interface. - (+) Configure Output channels for OC and PWM mode. - - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master synchronization. - (+) Configure timer remapping capabilities. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the TIM commutation event sequence. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with interrupt. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Disable Commutation DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); - - /* Enable the Commutation Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configure the TIM commutation event sequence with DMA. - * @note This function is mandatory to use the commutation event in order to - * update the configuration at each commutation detection on the TRGI input of the Timer, - * the typical use of this feature is with the use of another Timer(interface Timer) - * configured in Hall sensor interface, this interface Timer will generate the - * commutation at its TRGO output (connected to Timer used in this function) each time - * the TI1 of the Interface Timer detect a commutation at its input TI1. - * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set - * @param htim TIM handle - * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal trigger 0 selected - * @arg TIM_TS_ITR1: Internal trigger 1 selected - * @arg TIM_TS_ITR2: Internal trigger 2 selected - * @arg TIM_TS_ITR3: Internal trigger 3 selected - * @arg TIM_TS_NONE: No trigger is needed - * @param CommutationSource the Commutation Event source - * This parameter can be one of the following values: - * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer - * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, - uint32_t CommutationSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); - assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); - - __HAL_LOCK(htim); - - if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || - (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) - { - /* Select the Input trigger */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= InputTrigger; - } - - /* Select the Capture Compare preload feature */ - htim->Instance->CR2 |= TIM_CR2_CCPC; - /* Select the Commutation event source */ - htim->Instance->CR2 &= ~TIM_CR2_CCUS; - htim->Instance->CR2 |= CommutationSource; - - /* Enable the Commutation DMA Request */ - /* Set the DMA Commutation Callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; - - /* Disable Commutation Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); - - /* Enable the Commutation DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in master mode. - * @param htim TIM handle. - * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that - * contains the selected trigger output (TRGO) and the Master/Slave - * mode. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, - TIM_MasterConfigTypeDef *sMasterConfig) -{ - uint32_t tmpcr2; - uint32_t tmpsmcr; - - /* Check the parameters */ - assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); - assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Change the handler state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the MMS Bits */ - tmpcr2 &= ~TIM_CR2_MMS; - /* Select the TRGO source */ - tmpcr2 |= sMasterConfig->MasterOutputTrigger; - - /* Update TIMx CR2 */ - htim->Instance->CR2 = tmpcr2; - - if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) - { - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param htim TIM handle - * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @note Interrupts can be generated when an active level is detected on the - * break input, the break 2 input or the system break input. Break - * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) -{ - /* Keep this variable initialized to 0 as it is used to configure BDTR register */ - uint32_t tmpbdtr = 0U; - - /* Check the parameters */ - assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); - assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); - assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); - assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); - assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - - /* Check input state */ - __HAL_LOCK(htim); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - - /* Set the BDTR bits */ - MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); - MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); - MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); - MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); - - - /* Set TIMx_BDTR */ - htim->Instance->BDTR = tmpbdtr; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIMx Remapping input capabilities. - * @param htim TIM handle. - * @param Remap specifies the TIM remapping source. - * For TIM1, the parameter can have the following values: (**) - * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO - * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output - * - * For TIM2, the parameter can have the following values: (**) - * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) - * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) - * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF - * - * For TIM5, the parameter can have the following values: - * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO - * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI - * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE - * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt - * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) - * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) - * - * For TIM9, the parameter can have the following values: (**) - * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO - * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output - * - * For TIM11, the parameter can have the following values: - * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO - * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock - * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) - * - * (*) Value not defined in all devices. \n - * (**) Register not available in all devices. - * - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) -{ - __HAL_LOCK(htim); - - /* Check parameters */ - assert_param(IS_TIM_REMAP(htim->Instance, Remap)); - -#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) - if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) - { - /* Connect TIMx internal trigger to LPTIM1 output */ - __HAL_RCC_LPTIM1_CLK_ENABLE(); - MODIFY_REG(LPTIM1->OR, - (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), - Remap & ~(LPTIM_REMAP_MASK)); - } - else - { - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); - } -#else - /* Set the Timer remapping configuration */ - WRITE_REG(htim->Instance->OR, Remap); -#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions - * @brief Extended Callbacks functions - * -@verbatim - ============================================================================== - ##### Extended Callbacks functions ##### - ============================================================================== - [..] - This section provides Extended TIM callback functions: - (+) Timer Commutation callback - (+) Timer Break callback - -@endverbatim - * @{ - */ - -/** - * @brief Hall commutation changed callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutCallback could be implemented in the user file - */ -} -/** - * @brief Hall commutation changed half complete callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Break detection callback in non-blocking mode - * @param htim TIM handle - * @retval None - */ -__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) -{ - /* Prevent unused argument(s) compilation warning */ - UNUSED(htim); - - /* NOTE : This function should not be modified, when the callback is needed, - the HAL_TIMEx_BreakCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions - * @brief Extended Peripheral State functions - * -@verbatim - ============================================================================== - ##### Extended Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Hall Sensor interface handle state. - * @param htim TIM Hall Sensor handle - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIMEx Private Functions - * @{ - */ - -/** - * @brief TIM DMA Commutation callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationCallback(htim); -#else - HAL_TIMEx_CommutCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - -/** - * @brief TIM DMA Commutation half complete callback. - * @param hdma pointer to DMA handle. - * @retval None - */ -void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - -#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) - htim->CommutationHalfCpltCallback(htim); -#else - HAL_TIMEx_CommutHalfCpltCallback(htim); -#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ -} - - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx to select the TIM peripheral - * @param Channel specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 - * @arg TIM_CHANNEL_2: TIM Channel 2 - * @arg TIM_CHANNEL_3: TIM Channel 3 - * @param ChannelNState specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. - * @retval None - */ -static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) -{ - uint32_t tmp; - - tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ - - /* Reset the CCxNE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ -} -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer Extended peripheral: + * + Time Hall Sensor Interface Initialization + * + Time Hall Sensor Interface Start + * + Time Complementary signal break and dead time configuration + * + Time Master and Slave synchronization configuration + * + Timer remapping capabilities configuration + @verbatim + ============================================================================== + ##### TIMER Extended features ##### + ============================================================================== + [..] + The Timer Extended features include: + (#) Complementary outputs with programmable dead-time for : + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to + interconnect several timers together. + (#) Break input to put the timer output signals in reset state or in a known state. + (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for + positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + initialization function of this driver: + (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the + Timer Hall Sensor Interface and the commutation event with the corresponding + Interrupt and DMA request if needed (Note that One Timer is used to interface + with the Hall sensor Interface and another Timer should be used to use + the commutation event). + + (#) Activate the TIM peripheral using one of the start functions: + (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT() + (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT() + (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() + (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT(). + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig) +{ + TIM_OC_InitTypeDef OC_Config; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy week callbacks */ + TIM_ResetCallback(htim); + + if (htim->HallSensor_MspInitCallback == NULL) + { + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->HallSensor_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_HallSensor_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ + TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->IC1Prescaler; + + /* Enable the Hall sensor interface (XOR function of the three inputs) */ + htim->Instance->CR2 |= TIM_CR2_TI1S; + + /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1F_ED; + + /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; + + /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ + OC_Config.OCFastMode = TIM_OCFAST_DISABLE; + OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; + OC_Config.OCMode = TIM_OCMODE_PWM2; + OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; + OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; + OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; + OC_Config.Pulse = sConfig->Commutation_Delay; + + TIM_OC2_SetConfig(htim->Instance, &OC_Config); + + /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 + register to 101 */ + htim->Instance->CR2 &= ~TIM_CR2_MMS; + htim->Instance->CR2 |= TIM_TRGO_OC2REF; + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + break; + } + + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpccer; + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + break; + } + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + break; + } + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. + (+) Start the Complementary Input Capture measurement. + (+) Stop the Complementary Input Capture. + (+) Start the Complementary Input Capture and enable interrupts. + (+) Stop the Complementary Input Capture and disable interrupts. + (+) Start the Complementary Input Capture and enable DMA transfers. + (+) Stop the Complementary Input Capture and disable DMA transfers. + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + break; + } + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if (((uint32_t)pData == 0U) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK) + { + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + break; + } + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode on the complementary + * output + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + break; + } + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * +@verbatim + ============================================================================== + ##### Timer Complementary One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM One Pulse signal generation on the complementary + * output. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Enable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation on the complementary + * output. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + /* Enable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @param htim TIM One Pulse handle + * @param OutputChannel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the complementary One Pulse output */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure the commutation event in case of use of the Hall sensor interface. + (+) Configure Output channels for OC and PWM mode. + + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master synchronization. + (+) Configure timer remapping capabilities. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig) +{ + uint32_t tmpcr2; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); + assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Change the handler state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the MMS Bits */ + tmpcr2 &= ~TIM_CR2_MMS; + /* Select the TRGO source */ + tmpcr2 |= sMasterConfig->MasterOutputTrigger; + + /* Update TIMx CR2 */ + htim->Instance->CR2 = tmpcr2; + + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State + * and the AOE(automatic output enable). + * @param htim TIM handle + * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t tmpbdtr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); + assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); + assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); + assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); + assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = tmpbdtr; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIMx Remapping input capabilities. + * @param htim TIM handle. + * @param Remap specifies the TIM remapping source. + * For TIM1, the parameter can have the following values: (**) + * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO + * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output + * + * For TIM2, the parameter can have the following values: (**) + * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) + * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) + * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * + * For TIM5, the parameter can have the following values: + * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO + * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI + * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE + * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt + * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) + * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) + * + * For TIM9, the parameter can have the following values: (**) + * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO + * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output + * + * For TIM11, the parameter can have the following values: + * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO + * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock + * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) + * + * (*) Value not defined in all devices. \n + * (**) Register not available in all devices. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) +{ + __HAL_LOCK(htim); + + /* Check parameters */ + assert_param(IS_TIM_REMAP(htim->Instance, Remap)); + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) + if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) + { + /* Connect TIMx internal trigger to LPTIM1 output */ + __HAL_RCC_LPTIM1_CLK_ENABLE(); + MODIFY_REG(LPTIM1->OR, + (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), + Remap & ~(LPTIM_REMAP_MASK)); + } + else + { + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); + } +#else + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief Hall commutation changed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutCallback could be implemented in the user file + */ +} +/** + * @brief Hall commutation changed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Break detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_BreakCallback could be implemented in the user file + */ +} +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * +@verbatim + ============================================================================== + ##### Extended Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Hall Sensor interface handle state. + * @param htim TIM Hall Sensor handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxNE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/STM32F407VGTX_FLASH.ld b/itemis.create.examples.stm32f407vg.multism.blinky/STM32F407VGTX_FLASH.ld similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/STM32F407VGTX_FLASH.ld rename to itemis.create.examples.stm32f407vg.multism.blinky/STM32F407VGTX_FLASH.ld diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/STM32F407VGTX_RAM.ld b/itemis.create.examples.stm32f407vg.multism.blinky/STM32F407VGTX_RAM.ld similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/STM32F407VGTX_RAM.ld rename to itemis.create.examples.stm32f407vg.multism.blinky/STM32F407VGTX_RAM.ld diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc b/itemis.create.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc similarity index 96% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc rename to itemis.create.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc index a5eda815..5fd188d0 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc +++ b/itemis.create.examples.stm32f407vg.multism.blinky/com.yakindu.sct.examples.stm32f407vg.multism.blinky.ioc @@ -68,8 +68,8 @@ ProjectManager.MainLocation=Core/Src ProjectManager.NoMain=false ProjectManager.PreviousToolchain= ProjectManager.ProjectBuild=false -ProjectManager.ProjectFileName=org.yakindu.sct.examples.stm32f407vg.blinky.ioc -ProjectManager.ProjectName=org.yakindu.sct.examples.stm32f407vg.blinky +ProjectManager.ProjectFileName=itemis.create.examples.stm32f407vg.blinky.ioc +ProjectManager.ProjectName=itemis.create.examples.stm32f407vg.blinky ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.ToolChainLocation= diff --git a/org.yakindu.sct.examples.sctunit.cpp/css/style.css b/itemis.create.examples.stm32f407vg.multism.blinky/css/style.css similarity index 100% rename from org.yakindu.sct.examples.sctunit.cpp/css/style.css rename to itemis.create.examples.stm32f407vg.multism.blinky/css/style.css diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm.png b/itemis.create.examples.stm32f407vg.multism.blinky/images/stm.png similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm.png rename to itemis.create.examples.stm32f407vg.multism.blinky/images/stm.png diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm2.png b/itemis.create.examples.stm32f407vg.multism.blinky/images/stm2.png similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm2.png rename to itemis.create.examples.stm32f407vg.multism.blinky/images/stm2.png diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm_configuration.png b/itemis.create.examples.stm32f407vg.multism.blinky/images/stm_configuration.png similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm_configuration.png rename to itemis.create.examples.stm32f407vg.multism.blinky/images/stm_configuration.png diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm_preview.jpg b/itemis.create.examples.stm32f407vg.multism.blinky/images/stm_preview.jpg similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/images/stm_preview.jpg rename to itemis.create.examples.stm32f407vg.multism.blinky/images/stm_preview.jpg diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/index.html b/itemis.create.examples.stm32f407vg.multism.blinky/index.html similarity index 93% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/index.html rename to itemis.create.examples.stm32f407vg.multism.blinky/index.html index b8a05d50..e5d35270 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/index.html +++ b/itemis.create.examples.stm32f407vg.multism.blinky/index.html @@ -12,7 +12,7 @@

    [Pro] STM32F407 Discovery Board Using Multi State Machines With Deep C Integration

    - This is an example for the integration of YAKINDU Statechart Tools with another IDE, here the + This is an example for the integration of Itemis CREATE with another IDE, here the STM32CubeIDE. The example model demonstrates the usage of the multi state machines feature together with the deep C @@ -44,7 +44,7 @@

    Getting started

    required. You can find it HERE.

    - After downloading and installing the STM32CubeIDE, YAKINDU Statechart Tools Professional Edition must + After downloading and installing the STM32CubeIDE, Itemis CREATE Professional Edition must installed via the update site. You can follow these STEPS. diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/metadata.json b/itemis.create.examples.stm32f407vg.multism.blinky/metadata.json similarity index 85% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/metadata.json rename to itemis.create.examples.stm32f407vg.multism.blinky/metadata.json index 640e4185..8ee9f3a9 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/metadata.json +++ b/itemis.create.examples.stm32f407vg.multism.blinky/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.stm32f407vg.multism.blinky", + "id": "itemis.create.examples.stm32f407vg.multism.blinky", "title": "STM32F407 Discovery - Blinky LED (Deep C, Multi SM)", "author": "itemis AG", "description": "This is a simple example of how to use multi state machines in the C domain together with an STM32F407 Discovery board. C timers are integrated.", diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/LED.ysc b/itemis.create.examples.stm32f407vg.multism.blinky/model/LED.ysc similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/LED.ysc rename to itemis.create.examples.stm32f407vg.multism.blinky/model/LED.ysc index 73bda8c4..d63ffec4 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/LED.ysc +++ b/itemis.create.examples.stm32f407vg.multism.blinky/model/LED.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/controller.ysc b/itemis.create.examples.stm32f407vg.multism.blinky/model/controller.ysc similarity index 98% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/controller.ysc rename to itemis.create.examples.stm32f407vg.multism.blinky/model/controller.ysc index fede6a03..b8eb75c6 100644 --- a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/controller.ysc +++ b/itemis.create.examples.stm32f407vg.multism.blinky/model/controller.ysc @@ -13,7 +13,7 @@ - + diff --git a/com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/generator.sgen b/itemis.create.examples.stm32f407vg.multism.blinky/model/generator.sgen similarity index 100% rename from com.yakindu.sct.examples.stm32f407vg.multism.blinky/model/generator.sgen rename to itemis.create.examples.stm32f407vg.multism.blinky/model/generator.sgen diff --git a/org.yakindu.sct.examples.tictoc.tracing/.cproject b/itemis.create.examples.tictoc.tracing/.cproject similarity index 95% rename from org.yakindu.sct.examples.tictoc.tracing/.cproject rename to itemis.create.examples.tictoc.tracing/.cproject index 373bbe07..7bedef01 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/.cproject +++ b/itemis.create.examples.tictoc.tracing/.cproject @@ -37,7 +37,7 @@ - + @@ -131,7 +131,7 @@ - + @@ -189,7 +189,7 @@ - + @@ -219,13 +219,13 @@ - + - + diff --git a/org.yakindu.sct.examples.tictoc.tracing/.gitignore b/itemis.create.examples.tictoc.tracing/.gitignore similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/.gitignore rename to itemis.create.examples.tictoc.tracing/.gitignore diff --git a/org.yakindu.sct.examples.tictoc.tracing/.project b/itemis.create.examples.tictoc.tracing/.project similarity index 86% rename from org.yakindu.sct.examples.tictoc.tracing/.project rename to itemis.create.examples.tictoc.tracing/.project index c64a7c3f..23cea143 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/.project +++ b/itemis.create.examples.tictoc.tracing/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.tictoc.tracing + itemis.create.examples.tictoc.tracing @@ -23,7 +23,7 @@ - org.yakindu.sct.builder.SCTBuilder + itemis.create.builder.SCTBuilder @@ -33,6 +33,6 @@ org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature org.eclipse.xtext.ui.shared.xtextNature - org.yakindu.sct.builder.SCTNature + itemis.create.builder.SCTNature diff --git a/itemis.create.examples.tictoc.tracing/.tictoc.sctunit.xml b/itemis.create.examples.tictoc.tracing/.tictoc.sctunit.xml new file mode 100644 index 00000000..940cf71a --- /dev/null +++ b/itemis.create.examples.tictoc.tracing/.tictoc.sctunit.xml @@ -0,0 +1,5 @@ + + + Test failed due to 'java.lang.IllegalArgumentException': "Could not read trace file: itemis.create.examples.tictoc.tracing/trace.yet" + + diff --git a/org.yakindu.sct.examples.tictoc.tracing/hmi.c b/itemis.create.examples.tictoc.tracing/hmi.c similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/hmi.c rename to itemis.create.examples.tictoc.tracing/hmi.c diff --git a/org.yakindu.sct.examples.tictoc.tracing/hmi.h b/itemis.create.examples.tictoc.tracing/hmi.h similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/hmi.h rename to itemis.create.examples.tictoc.tracing/hmi.h diff --git a/org.yakindu.sct.examples.tictoc.tracing/images/tictoc_debugging.png b/itemis.create.examples.tictoc.tracing/images/tictoc_debugging.png similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/images/tictoc_debugging.png rename to itemis.create.examples.tictoc.tracing/images/tictoc_debugging.png diff --git a/org.yakindu.sct.examples.tictoc.tracing/images/yet_configure_trace_debugging.png b/itemis.create.examples.tictoc.tracing/images/yet_configure_trace_debugging.png similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/images/yet_configure_trace_debugging.png rename to itemis.create.examples.tictoc.tracing/images/yet_configure_trace_debugging.png diff --git a/org.yakindu.sct.examples.tictoc.tracing/images/yet_launch_trace_debugging.png b/itemis.create.examples.tictoc.tracing/images/yet_launch_trace_debugging.png similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/images/yet_launch_trace_debugging.png rename to itemis.create.examples.tictoc.tracing/images/yet_launch_trace_debugging.png diff --git a/org.yakindu.sct.examples.tictoc.tracing/images/yet_target_trace_debugging.png b/itemis.create.examples.tictoc.tracing/images/yet_target_trace_debugging.png similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/images/yet_target_trace_debugging.png rename to itemis.create.examples.tictoc.tracing/images/yet_target_trace_debugging.png diff --git a/org.yakindu.sct.examples.tictoc.tracing/index.html b/itemis.create.examples.tictoc.tracing/index.html similarity index 95% rename from org.yakindu.sct.examples.tictoc.tracing/index.html rename to itemis.create.examples.tictoc.tracing/index.html index 525d4d86..b923853e 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/index.html +++ b/itemis.create.examples.tictoc.tracing/index.html @@ -8,11 +8,11 @@

    - + DISCLAIMER: This example only work with UNIX based systems due to the nature of Eclipse console

    Debug and remote control state machines using YET

    - The YAKINDU Execution Trace (YET) infrastructure supports interoperability between - state machines running in a target application and the YAKINDU tooling. + The CREATE Execution Trace (YET) infrastructure supports interoperability between + state machines running in a target application and the CREATE tooling. It supports model-level debugging and testing of the state machines based on execution traces. This example shows how to remote debug a compiled state machine step by step. Please refer to the YET documentation for more information. diff --git a/org.yakindu.sct.examples.tictoc.tracing/main.c b/itemis.create.examples.tictoc.tracing/main.c similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/main.c rename to itemis.create.examples.tictoc.tracing/main.c diff --git a/org.yakindu.sct.examples.tictoc.tracing/metadata.json b/itemis.create.examples.tictoc.tracing/metadata.json similarity index 67% rename from org.yakindu.sct.examples.tictoc.tracing/metadata.json rename to itemis.create.examples.tictoc.tracing/metadata.json index 3bbd374c..e7332f6a 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/metadata.json +++ b/itemis.create.examples.tictoc.tracing/metadata.json @@ -1,7 +1,7 @@ { - "id": "org.yakindu.sct.examples.tictoc.tracing", + "id": "itemis.create.examples.tictoc.tracing", "title": "TicToc - Tracing & Remote Control (C)", - "description": "YAKINDU provides infrastructure for debugging and remote controlling the state machines using execution traces (YET).", + "description": "CREATE provides infrastructure for debugging and remote controlling the state machines using execution traces (YET).", "previewImage": "yet_target_trace_debugging.png", "author": "itemis AG", "license": "GNU Free Documentation License version 1.3", diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_file.c b/itemis.create.examples.tictoc.tracing/sc/util/yet_file.c similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_file.c rename to itemis.create.examples.tictoc.tracing/sc/util/yet_file.c diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_file.h b/itemis.create.examples.tictoc.tracing/sc/util/yet_file.h similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_file.h rename to itemis.create.examples.tictoc.tracing/sc/util/yet_file.h diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_logger.c b/itemis.create.examples.tictoc.tracing/sc/util/yet_logger.c similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_logger.c rename to itemis.create.examples.tictoc.tracing/sc/util/yet_logger.c diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_logger.h b/itemis.create.examples.tictoc.tracing/sc/util/yet_logger.h similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_logger.h rename to itemis.create.examples.tictoc.tracing/sc/util/yet_logger.h diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_udp_stream.c b/itemis.create.examples.tictoc.tracing/sc/util/yet_udp_stream.c similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_udp_stream.c rename to itemis.create.examples.tictoc.tracing/sc/util/yet_udp_stream.c diff --git a/org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_udp_stream.h b/itemis.create.examples.tictoc.tracing/sc/util/yet_udp_stream.h similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/sc/util/yet_udp_stream.h rename to itemis.create.examples.tictoc.tracing/sc/util/yet_udp_stream.h diff --git a/org.yakindu.sct.examples.tictoc.tracing/tictoc.sct b/itemis.create.examples.tictoc.tracing/tictoc.sct similarity index 99% rename from org.yakindu.sct.examples.tictoc.tracing/tictoc.sct rename to itemis.create.examples.tictoc.tracing/tictoc.sct index 78ef5eda..10e7c900 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/tictoc.sct +++ b/itemis.create.examples.tictoc.tracing/tictoc.sct @@ -24,7 +24,7 @@ - + diff --git a/org.yakindu.sct.examples.tictoc.tracing/tictoc_sm.sgen b/itemis.create.examples.tictoc.tracing/tictoc_sm.sgen similarity index 82% rename from org.yakindu.sct.examples.tictoc.tracing/tictoc_sm.sgen rename to itemis.create.examples.tictoc.tracing/tictoc_sm.sgen index 09bafd79..55d090f0 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/tictoc_sm.sgen +++ b/itemis.create.examples.tictoc.tracing/tictoc_sm.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::c { statechart tictoc { feature Outlet { - targetProject = "org.yakindu.sct.examples.tictoc.tracing" + targetProject = "itemis.create.examples.tictoc.tracing" targetFolder = "sc" libraryTargetFolder = "sc/base" } diff --git a/org.yakindu.sct.examples.tictoc.tracing/tictoc_trace.sgen b/itemis.create.examples.tictoc.tracing/tictoc_trace.sgen similarity index 71% rename from org.yakindu.sct.examples.tictoc.tracing/tictoc_trace.sgen rename to itemis.create.examples.tictoc.tracing/tictoc_trace.sgen index d10a19ba..b7754825 100644 --- a/org.yakindu.sct.examples.tictoc.tracing/tictoc_trace.sgen +++ b/itemis.create.examples.tictoc.tracing/tictoc_trace.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::c::yet { statechart tictoc { feature Outlet { - targetProject = "org.yakindu.sct.examples.tictoc.tracing" + targetProject = "itemis.create.examples.tictoc.tracing" targetFolder = "sc" libraryTargetFolder = "sc/base" } diff --git a/org.yakindu.sct.examples.tictoc.tracing/trace.yet b/itemis.create.examples.tictoc.tracing/trace.yet similarity index 100% rename from org.yakindu.sct.examples.tictoc.tracing/trace.yet rename to itemis.create.examples.tictoc.tracing/trace.yet diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/.cproject b/itemis.create.examples.trafficlight.c.arduino/.cproject similarity index 92% rename from org.yakindu.sct.examples.trafficlight.c.arduino/.cproject rename to itemis.create.examples.trafficlight.c.arduino/.cproject index 2ecdbb34..e54be1f3 100644 --- a/org.yakindu.sct.examples.trafficlight.c.arduino/.cproject +++ b/itemis.create.examples.trafficlight.c.arduino/.cproject @@ -21,8 +21,8 @@ @@ -30,8 +30,8 @@ @@ -39,8 +39,8 @@ diff --git a/org.yakindu.sct.examples.lightctrl.c.arduino/.gitignore b/itemis.create.examples.trafficlight.c.arduino/.gitignore similarity index 100% rename from org.yakindu.sct.examples.lightctrl.c.arduino/.gitignore rename to itemis.create.examples.trafficlight.c.arduino/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/.project b/itemis.create.examples.trafficlight.c.arduino/.project similarity index 96% rename from org.yakindu.sct.examples.trafficlight.c.arduino/.project rename to itemis.create.examples.trafficlight.c.arduino/.project index def04af6..8c27a0a1 100644 --- a/org.yakindu.sct.examples.trafficlight.c.arduino/.project +++ b/itemis.create.examples.trafficlight.c.arduino/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.c.arduino + itemis.create.examples.trafficlight.c.arduino diff --git a/org.yakindu.sct.examples.sctunit.java/css/style.css b/itemis.create.examples.trafficlight.c.arduino/css/style.css similarity index 100% rename from org.yakindu.sct.examples.sctunit.java/css/style.css rename to itemis.create.examples.trafficlight.c.arduino/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/TrafficLightCtrl.png b/itemis.create.examples.trafficlight.c.arduino/images/TrafficLightCtrl.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/TrafficLightCtrl.png rename to itemis.create.examples.trafficlight.c.arduino/images/TrafficLightCtrl.png diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino.jpg b/itemis.create.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino.jpg rename to itemis.create.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino.jpg diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg b/itemis.create.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg rename to itemis.create.examples.trafficlight.c.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_1.jpg b/itemis.create.examples.trafficlight.c.arduino/images/arduino_1.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_1.jpg rename to itemis.create.examples.trafficlight.c.arduino/images/arduino_1.jpg diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_2.jpg b/itemis.create.examples.trafficlight.c.arduino/images/arduino_2.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_2.jpg rename to itemis.create.examples.trafficlight.c.arduino/images/arduino_2.jpg diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_buttons.png b/itemis.create.examples.trafficlight.c.arduino/images/arduino_buttons.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/arduino_buttons.png rename to itemis.create.examples.trafficlight.c.arduino/images/arduino_buttons.png diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/images/screenshot_installhardware.png b/itemis.create.examples.trafficlight.c.arduino/images/screenshot_installhardware.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/images/screenshot_installhardware.png rename to itemis.create.examples.trafficlight.c.arduino/images/screenshot_installhardware.png diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/index.html b/itemis.create.examples.trafficlight.c.arduino/index.html similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/index.html rename to itemis.create.examples.trafficlight.c.arduino/index.html diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/metadata.json b/itemis.create.examples.trafficlight.c.arduino/metadata.json similarity index 83% rename from org.yakindu.sct.examples.trafficlight.c.arduino/metadata.json rename to itemis.create.examples.trafficlight.c.arduino/metadata.json index 2ec873d0..e3c82e04 100644 --- a/org.yakindu.sct.examples.trafficlight.c.arduino/metadata.json +++ b/itemis.create.examples.trafficlight.c.arduino/metadata.json @@ -1,9 +1,9 @@ { - "id": "org.yakindu.sct.examples.trafficlight.c.arduino", + "id": "itemis.create.examples.trafficlight.c.arduino", "title": "Arduino - Traffic Light (C)", "author": "itemis AG", "description": "Wondering how to execute your state machine on the Arduino platform? This example demonstrates the necessary steps, like installing the Arduino plugin, building the hardware, turning your statechart into code and uploading it to the Arduino. It does so by means of the standard traffic light example.", - "previewImage": "YAKINDU-Statecharts-Arduino_thumb.jpg", + "previewImage": "CREATE-Statecharts-Arduino_thumb.jpg", "category": [ "open source", "embedded" diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen b/itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen similarity index 72% rename from org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen rename to itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen index 0b5c7c08..bf08e720 100644 --- a/org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen +++ b/itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::c { statechart TrafficLightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.c.arduino" + targetProject = "itemis.create.examples.trafficlight.c.arduino" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc b/itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc rename to itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc index e18fd4b2..bf5b66cf 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc +++ b/itemis.create.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc @@ -64,7 +64,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/pushbutton.c b/itemis.create.examples.trafficlight.c.arduino/pushbutton.c similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/pushbutton.c rename to itemis.create.examples.trafficlight.c.arduino/pushbutton.c diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/pushbutton.h b/itemis.create.examples.trafficlight.c.arduino/pushbutton.h similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/pushbutton.h rename to itemis.create.examples.trafficlight.c.arduino/pushbutton.h diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/traffic_light_arduino.ino b/itemis.create.examples.trafficlight.c.arduino/traffic_light_arduino.ino similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/traffic_light_arduino.ino rename to itemis.create.examples.trafficlight.c.arduino/traffic_light_arduino.ino diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/.cproject b/itemis.create.examples.trafficlight.cpp.arduino/.cproject similarity index 92% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/.cproject rename to itemis.create.examples.trafficlight.cpp.arduino/.cproject index 83714b34..9a171233 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/.cproject +++ b/itemis.create.examples.trafficlight.cpp.arduino/.cproject @@ -21,8 +21,8 @@ @@ -30,8 +30,8 @@ @@ -39,8 +39,8 @@ diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/.gitignore b/itemis.create.examples.trafficlight.cpp.arduino/.gitignore similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/.gitignore rename to itemis.create.examples.trafficlight.cpp.arduino/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/.project b/itemis.create.examples.trafficlight.cpp.arduino/.project similarity index 95% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/.project rename to itemis.create.examples.trafficlight.cpp.arduino/.project index c87a5b54..a7d71253 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/.project +++ b/itemis.create.examples.trafficlight.cpp.arduino/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.cpp.arduino + itemis.create.examples.trafficlight.cpp.arduino diff --git a/org.yakindu.sct.examples.sctunit.python/css/style.css b/itemis.create.examples.trafficlight.cpp.arduino/css/style.css similarity index 100% rename from org.yakindu.sct.examples.sctunit.python/css/style.css rename to itemis.create.examples.trafficlight.cpp.arduino/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/TrafficLightCtrl.png b/itemis.create.examples.trafficlight.cpp.arduino/images/TrafficLightCtrl.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/TrafficLightCtrl.png rename to itemis.create.examples.trafficlight.cpp.arduino/images/TrafficLightCtrl.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino.jpg b/itemis.create.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino.jpg rename to itemis.create.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino.jpg diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg b/itemis.create.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg rename to itemis.create.examples.trafficlight.cpp.arduino/images/YAKINDU-Statecharts-Arduino_thumb.jpg diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino-traffic-light.png b/itemis.create.examples.trafficlight.cpp.arduino/images/arduino-traffic-light.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino-traffic-light.png rename to itemis.create.examples.trafficlight.cpp.arduino/images/arduino-traffic-light.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_1.jpg b/itemis.create.examples.trafficlight.cpp.arduino/images/arduino_1.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_1.jpg rename to itemis.create.examples.trafficlight.cpp.arduino/images/arduino_1.jpg diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_2.jpg b/itemis.create.examples.trafficlight.cpp.arduino/images/arduino_2.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_2.jpg rename to itemis.create.examples.trafficlight.cpp.arduino/images/arduino_2.jpg diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_buttons.png b/itemis.create.examples.trafficlight.cpp.arduino/images/arduino_buttons.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/arduino_buttons.png rename to itemis.create.examples.trafficlight.cpp.arduino/images/arduino_buttons.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/images/screenshot_installhardware.png b/itemis.create.examples.trafficlight.cpp.arduino/images/screenshot_installhardware.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/images/screenshot_installhardware.png rename to itemis.create.examples.trafficlight.cpp.arduino/images/screenshot_installhardware.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/index.html b/itemis.create.examples.trafficlight.cpp.arduino/index.html similarity index 97% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/index.html rename to itemis.create.examples.trafficlight.cpp.arduino/index.html index a63c42ad..42ec27d1 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/index.html +++ b/itemis.create.examples.trafficlight.cpp.arduino/index.html @@ -1,118 +1,118 @@ - - - - -Traffic Light (C++) for Arduino - - - - -

    - -

    Traffic Light (C++) for Arduino

    - -

    Based on the standard traffic light example, this project shows how - to use a statechart to develop software for the Arduino platform.

    - -

    - The statechart -

    - -

    More information about the statechart itself can be found in the - standard traffic light example, which should be considered first. In - summary, we have two traffic lights: one for the traffic on the street, - and one for pedestrians who want to cross the street. They can push a - button to request their traffic light to turn green, which activates a - blinking wait-light first. The street's traffic light then goes through - the standard procedure, turning on the yellow light, followed by the red - light, allowing the pedestrians to cross safely. After some time, the - pedestrians' traffic light turns red again, and the cars are allowed to - pass until the next request is made by a pedestrian.

    - -

    Additionally, the traffic light can be switched off completely. This - turns the yellow lights into a blinking mode, signaling that the traffic - light is indeed switched off and that the street should be crossed in a - careful manner.

    - -
    -

    Running the example on the Hardware

    -

    This video shows how the state machine runs on the example:

    - -
    - -
    -

    Building the Hardware

    - -

    - The circuit needed for the project -

    - -

    The correct pins can be found in the arduinoPins.h file.

    -

    Get your parts ready! You will need:

    - -
      -
    • 2 push buttons
    • -
    • 6 LEDs, ideally: -
        -
      • 2x red
      • -
      • 2x green
      • -
      • 1x yellow
      • -
      • 1x white
      • -
      -
    • -
    • 8 resistors: -
        -
      • 2x 10kR or similar
      • -
      • 6x 220R or similar
      • -
      -
    • -
    - -

    Of course, you can change the pins, but since this represents the - pin numbers in the software, don't forget to change them as well.

    -
    - -

    Addons for compiling and flashing

    -

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. -

    How to install the Sloeber plugin

    -

    - There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. -

    -

    - Another way is installing the plugin manually. You need to follow these steps: -

      -
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. -
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. -
    5. Choose the plugin - not the IDE.
    6. -
    7. Follow the instructions
    8. -
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. -
    -

    Configure the Sloeber plugin

    -

    - After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. - Initially, the projects are not configured, as you may require to add the toolchain: -

      -
    1. Click on Window -> Preferences
    2. -
    3. Open the Arduino window -> Platforms and Boards
    4. -
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. -
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. -
    - Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. -

    -

    Configure the example

    - Once you have installed the toolchain for your Arduino, you can configure the project. -
      -
    1. Right click the project and open the Preference page
    2. -
    3. Open the Arduino window
    4. -
    5. Choose your platform and port
    6. -
    - There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. -

    Compile and upload

    -

    - Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! -

    - - - + + + + +Traffic Light (C++) for Arduino + + + + +
    + +

    Traffic Light (C++) for Arduino

    + +

    Based on the standard traffic light example, this project shows how + to use a statechart to develop software for the Arduino platform.

    + +

    + The statechart +

    + +

    More information about the statechart itself can be found in the + standard traffic light example, which should be considered first. In + summary, we have two traffic lights: one for the traffic on the street, + and one for pedestrians who want to cross the street. They can push a + button to request their traffic light to turn green, which activates a + blinking wait-light first. The street's traffic light then goes through + the standard procedure, turning on the yellow light, followed by the red + light, allowing the pedestrians to cross safely. After some time, the + pedestrians' traffic light turns red again, and the cars are allowed to + pass until the next request is made by a pedestrian.

    + +

    Additionally, the traffic light can be switched off completely. This + turns the yellow lights into a blinking mode, signaling that the traffic + light is indeed switched off and that the street should be crossed in a + careful manner.

    + +
    +

    Running the example on the Hardware

    +

    This video shows how the state machine runs on the example:

    + +
    + +
    +

    Building the Hardware

    + +

    + The circuit needed for the project +

    + +

    The correct pins can be found in the arduinoPins.h file.

    +

    Get your parts ready! You will need:

    + +
      +
    • 2 push buttons
    • +
    • 6 LEDs, ideally: +
        +
      • 2x red
      • +
      • 2x green
      • +
      • 1x yellow
      • +
      • 1x white
      • +
      +
    • +
    • 8 resistors: +
        +
      • 2x 10kR or similar
      • +
      • 6x 220R or similar
      • +
      +
    • +
    + +

    Of course, you can change the pins, but since this represents the + pin numbers in the software, don't forget to change them as well.

    +
    + +

    Addons for compiling and flashing

    +

    All Arduino examples can be compiled via command line or be imported into the Arduino IDE. An easier way is using the Sloeber plugin , which allows you to compile and upload the code directly in Statechart Tools. +

    How to install the Sloeber plugin

    +

    + There are two ways of how to install the plugin. The easiest way is using our example wizard, which allows you installing required plugins. Just follow the built-in instructions. +

    +

    + Another way is installing the plugin manually. You need to follow these steps: +

      +
    1. Click on 'Help' -> 'Install New Software..' -> 'Add...'.
    2. +
    3. Define a name and add 'http://eclipse.baeyens.it/update/V4/stable' as location.
    4. +
    5. Choose the plugin - not the IDE.
    6. +
    7. Follow the instructions
    8. +
    9. The installation dialog will ask you for a restart. After this restart is done, the installition it will download some files. Just wait until it's finished
    10. +
    +

    Configure the Sloeber plugin

    +

    + After the installation you should notice a new Toolbar, which allows you to compile and flash your Arduino. + Initially, the projects are not configured, as you may require to add the toolchain: +

      +
    1. Click on Window -> Preferences
    2. +
    3. Open the Arduino window -> Platforms and Boards
    4. +
    5. Depending on your Arduino, choose the board. For the UNO click on arduino -> Arduino AVR -> check out one toolchain
    6. +
    7. Click on Apply and Close and wait until the downlaod has been finished
    8. +
    + Some examples may need different libraries. E.g. the LiquidCrystal lib. If so, repeat the steps using the Library Manager and add your required lib. +

    +

    Configure the example

    + Once you have installed the toolchain for your Arduino, you can configure the project. +
      +
    1. Right click the project and open the Preference page
    2. +
    3. Open the Arduino window
    4. +
    5. Choose your platform and port
    6. +
    + There will be a dialog, which warns you that the platform.txt is missing. This is not a problem and will be resolved after the intitial configuration. +

    Compile and upload

    +

    + Finally, you can use the green toolbar for compiling and flashing the Arduino. Have fun! +

    + + + diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/main.ino b/itemis.create.examples.trafficlight.cpp.arduino/main.ino similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/main.ino rename to itemis.create.examples.trafficlight.cpp.arduino/main.ino diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/metadata.json b/itemis.create.examples.trafficlight.cpp.arduino/metadata.json similarity index 91% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/metadata.json rename to itemis.create.examples.trafficlight.cpp.arduino/metadata.json index 559544ee..cb17c62d 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/metadata.json +++ b/itemis.create.examples.trafficlight.cpp.arduino/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.trafficlight.cpp.arduino", + "id": "itemis.create.examples.trafficlight.cpp.arduino", "title": "Arduino - Traffic Light (C++)", "author": "itemis AG", "description": "Wondering how to execute your state machine on the Arduino platform? This example demonstrates the necessary steps, like installing the Arduino plugin, building the hardware, turning your statechart into code and uploading it to the Arduino. It does so by means of the standard traffic light example.", diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen b/itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen similarity index 71% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen rename to itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen index 231abf19..81efe834 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen +++ b/itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::cpp { statechart TrafficLightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.cpp.arduino" + targetProject = "itemis.create.examples.trafficlight.cpp.arduino" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc b/itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc rename to itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc index e18fd4b2..bf5b66cf 100644 --- a/org.yakindu.sct.examples.trafficlight.c.arduino/model/TrafficLightCtrl.ysc +++ b/itemis.create.examples.trafficlight.cpp.arduino/model/TrafficLightCtrl.ysc @@ -64,7 +64,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/src/PushButton.cpp b/itemis.create.examples.trafficlight.cpp.arduino/src/PushButton.cpp similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/src/PushButton.cpp rename to itemis.create.examples.trafficlight.cpp.arduino/src/PushButton.cpp diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/src/PushButton.h b/itemis.create.examples.trafficlight.cpp.arduino/src/PushButton.h similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/src/PushButton.h rename to itemis.create.examples.trafficlight.cpp.arduino/src/PushButton.h diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.cpp b/itemis.create.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.cpp similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.cpp rename to itemis.create.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.cpp diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.h b/itemis.create.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.h similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.h rename to itemis.create.examples.trafficlight.cpp.arduino/src/TrafficLightOCBs.h diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/src/arduinoPins.h b/itemis.create.examples.trafficlight.cpp.arduino/src/arduinoPins.h similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/src/arduinoPins.h rename to itemis.create.examples.trafficlight.cpp.arduino/src/arduinoPins.h diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/.cproject b/itemis.create.examples.trafficlight.cpp.qt/.cproject similarity index 93% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/.cproject rename to itemis.create.examples.trafficlight.cpp.qt/.cproject index 60c9e57f..d059dbdf 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/.cproject +++ b/itemis.create.examples.trafficlight.cpp.qt/.cproject @@ -18,7 +18,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -93,7 +93,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/.project b/itemis.create.examples.trafficlight.cpp.qt/.project similarity index 88% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/.project rename to itemis.create.examples.trafficlight.cpp.qt/.project index 440f9b59..dc6223aa 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/.project +++ b/itemis.create.examples.trafficlight.cpp.qt/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.cpp.qt + itemis.create.examples.trafficlight.cpp.qt @@ -23,7 +23,7 @@ - org.yakindu.sct.builder.SCTBuilder + itemis.create.builder.SCTBuilder @@ -39,7 +39,7 @@ org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature org.eclipse.xtext.ui.shared.xtextNature - org.yakindu.sct.builder.SCTNature + itemis.create.builder.SCTNature com.yakindu.sct.builder.SCTNature diff --git a/org.yakindu.sct.examples.sctunit/css/style.css b/itemis.create.examples.trafficlight.cpp.qt/css/style.css similarity index 100% rename from org.yakindu.sct.examples.sctunit/css/style.css rename to itemis.create.examples.trafficlight.cpp.qt/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/images/traffic_light.jpg b/itemis.create.examples.trafficlight.cpp.qt/images/traffic_light.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/images/traffic_light.jpg rename to itemis.create.examples.trafficlight.cpp.qt/images/traffic_light.jpg diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/images/trafficlights.png b/itemis.create.examples.trafficlight.cpp.qt/images/trafficlights.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/images/trafficlights.png rename to itemis.create.examples.trafficlight.cpp.qt/images/trafficlights.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/images/trafficlights_sc.png b/itemis.create.examples.trafficlight.cpp.qt/images/trafficlights_sc.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/images/trafficlights_sc.png rename to itemis.create.examples.trafficlight.cpp.qt/images/trafficlights_sc.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/background.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/background.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/background.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/background.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/green.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/green.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/green.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/green.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/pause.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/pause.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/pause.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/pause.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/play.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/play.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/play.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/play.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/red.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/red.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/red.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/red.png diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/yellow.png b/itemis.create.examples.trafficlight.cpp.qt/implementation/images/yellow.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/images/yellow.png rename to itemis.create.examples.trafficlight.cpp.qt/implementation/images/yellow.png diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.cpp b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.cpp new file mode 100644 index 00000000..5565cd62 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.cpp @@ -0,0 +1,821 @@ +/** Generated by itemis CREATE code generator. */ + +#include "TrafficLightStateMachine.h" + +/*! \file +Implementation of the state machine 'TrafficLightStateMachine' +*/ + + + + +TrafficLightStateMachine::TrafficLightStateMachine(QObject *parent) noexcept : + standby_raised(false), + operate_raised(false), + timerService(nullptr), + isExecuting(false) +{ + for (sc::ushort state_vec_pos = 0; state_vec_pos < maxOrthogonalStates; ++state_vec_pos) + stateConfVector[state_vec_pos] = TrafficLightStateMachine::State::NO_STATE; + + clearInEvents(); +} + +TrafficLightStateMachine::~TrafficLightStateMachine() +{ +} + + + +std::unique_ptr TrafficLightStateMachine::getNextEvent() noexcept +{ + std::unique_ptr nextEvent = 0; + + if(!incomingEventQueue.empty()) { + nextEvent = std::move(incomingEventQueue.front()); + incomingEventQueue.pop_front(); + } + + return nextEvent; + +} + + +template +std::unique_ptr cast_event_pointer_type (std::unique_ptr&& event){ + return std::unique_ptr{static_cast(event.release())}; +} + +bool TrafficLightStateMachine::dispatchEvent(std::unique_ptr event) noexcept +{ + if(event == nullptr) { + return false; + } + + switch(event->eventId) + { + case TrafficLightStateMachine::Event::standby: + { + standby_raised = true; + break; + } + case TrafficLightStateMachine::Event::operate: + { + operate_raised = true; + break; + } + + + case TrafficLightStateMachine::Event::_te0_trafficlight_operating_r_prepare_switch_to_go_: + case TrafficLightStateMachine::Event::_te1_trafficlight_operating_r_prepare_switch_to_stop_: + case TrafficLightStateMachine::Event::_te2_trafficlight_operating_r_stop_: + case TrafficLightStateMachine::Event::_te3_trafficlight_operating_r_go_: + case TrafficLightStateMachine::Event::_te4_trafficlight_standby_blink_on_: + case TrafficLightStateMachine::Event::_te5_trafficlight_standby_blink_off_: + { + timeEvents[static_cast(event->eventId) - static_cast(TrafficLightStateMachine::Event::_te0_trafficlight_operating_r_prepare_switch_to_go_)] = true; + break; + } + default: + //pointer got out of scope + return false; + } + //pointer got out of scope + return true; +} + + +sc::rx::Observable& TrafficLightStateMachine::getRedOn() noexcept { + return this->redOn_observable; +} + + +sc::rx::Observable& TrafficLightStateMachine::getRedOff() noexcept { + return this->redOff_observable; +} + + +sc::rx::Observable& TrafficLightStateMachine::getYellowOn() noexcept { + return this->yellowOn_observable; +} + + +sc::rx::Observable& TrafficLightStateMachine::getYellowOff() noexcept { + return this->yellowOff_observable; +} + + +sc::rx::Observable& TrafficLightStateMachine::getGreenOn() noexcept { + return this->greenOn_observable; +} + + +sc::rx::Observable& TrafficLightStateMachine::getGreenOff() noexcept { + return this->greenOff_observable; +} + + +/*! Slot for the in event 'standby' that is defined in the default interface scope. */ +void TrafficLightStateMachine::standby() { + incomingEventQueue.push_back(std::unique_ptr(new TrafficLightStateMachine::EventInstance(TrafficLightStateMachine::Event::standby))) + ; + runCycle(); +} + + +/*! Slot for the in event 'operate' that is defined in the default interface scope. */ +void TrafficLightStateMachine::operate() { + incomingEventQueue.push_back(std::unique_ptr(new TrafficLightStateMachine::EventInstance(TrafficLightStateMachine::Event::operate))) + ; + runCycle(); +} + + + +bool TrafficLightStateMachine::isActive() const noexcept +{ + return stateConfVector[0] != TrafficLightStateMachine::State::NO_STATE; +} + +/* + * Always returns 'false' since this state machine can never become final. + */ +bool TrafficLightStateMachine::isFinal() const noexcept +{ + return false; +} + +bool TrafficLightStateMachine::check() const noexcept{ + if(timerService == nullptr) { + return false; + } + return true; +} + + +void TrafficLightStateMachine::setTimerService(std::shared_ptr timerService_) noexcept +{ + this->timerService = timerService_; +} + +std::shared_ptr TrafficLightStateMachine::getTimerService() noexcept +{ + return timerService; +} + +sc::integer TrafficLightStateMachine::getNumberOfParallelTimeEvents() noexcept { + return parallelTimeEventsCount; +} + +void TrafficLightStateMachine::raiseTimeEvent(sc::eventid evid) +{ + if (evid < timeEventsCount) + { + incomingEventQueue.push_back(std::unique_ptr< EventInstance>(new EventInstance(static_cast(evid + static_cast(TrafficLightStateMachine::Event::_te0_trafficlight_operating_r_prepare_switch_to_go_))))); + runCycle(); + } +} + + +bool TrafficLightStateMachine::isStateActive(State state) const noexcept +{ + switch (state) + { + case TrafficLightStateMachine::State::trafficlight_operating : + { + return (stateConfVector[scvi_trafficlight_operating] >= TrafficLightStateMachine::State::trafficlight_operating && stateConfVector[scvi_trafficlight_operating] <= TrafficLightStateMachine::State::trafficlight_operating_r_go); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare : + { + return (stateConfVector[scvi_trafficlight_operating_r_prepare] >= TrafficLightStateMachine::State::trafficlight_operating_r_prepare && stateConfVector[scvi_trafficlight_operating_r_prepare] <= TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + return (stateConfVector[scvi_trafficlight_operating_r_prepare_switch_to_go] == TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + return (stateConfVector[scvi_trafficlight_operating_r_prepare_switch_to_stop] == TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_stop : + { + return (stateConfVector[scvi_trafficlight_operating_r_stop] == TrafficLightStateMachine::State::trafficlight_operating_r_stop); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_go : + { + return (stateConfVector[scvi_trafficlight_operating_r_go] == TrafficLightStateMachine::State::trafficlight_operating_r_go); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby : + { + return (stateConfVector[scvi_trafficlight_standby] >= TrafficLightStateMachine::State::trafficlight_standby && stateConfVector[scvi_trafficlight_standby] <= TrafficLightStateMachine::State::trafficlight_standby_blink_off); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_on : + { + return (stateConfVector[scvi_trafficlight_standby_blink_on] == TrafficLightStateMachine::State::trafficlight_standby_blink_on); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_off : + { + return (stateConfVector[scvi_trafficlight_standby_blink_off] == TrafficLightStateMachine::State::trafficlight_standby_blink_off); + break; + } + default: + { + /* State is not active*/ + return false; + break; + } + } +} + + +// implementations of all internal functions +sc::integer TrafficLightStateMachine::react(const sc::integer transitioned_before) { + /* State machine reactions. */ + return transitioned_before; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_react(const sc::integer transitioned_before) { + /* The reactions of state operating. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (standby_raised) + { + /* Default exit sequence for state operating */ + /* Default exit sequence for region r */ + /* Handle exit of all possible states (of TrafficLightStateMachine.trafficlight.operating.r) at position 0... */ + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + /* Default exit sequence for state to go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to go'. */ + timerService->unsetTimer(shared_from_this(), 0); + redOff_observable.next(); + emit redOff(); + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + /* Default exit sequence for state to stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to stop'. */ + timerService->unsetTimer(shared_from_this(), 1); + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_stop : + { + /* Default exit sequence for state stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'stop'. */ + timerService->unsetTimer(shared_from_this(), 2); + redOff_observable.next(); + emit redOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_go : + { + /* Default exit sequence for state go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'go'. */ + timerService->unsetTimer(shared_from_this(), 3); + greenOff_observable.next(); + emit greenOff(); + break; + } + default: + /* do nothing */ + break; + } + /* 'default' enter sequence for state standby */ + /* 'default' enter sequence for region blink */ + /* Default react sequence for initial entry */ + /* 'default' enter sequence for state on */ + /* Entry action for state 'on'. */ + timerService->setTimer(shared_from_this(), 4, (((sc::time) 1) * 1000), false); + yellowOn_observable.next(); + emit yellowOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_standby_blink_on; + react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_r_prepare_react(const sc::integer transitioned_before) { + /* The reactions of state prepare. */ + sc::integer transitioned_after = transitioned_before; + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_operating_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_r_prepare_switch_to_go_react(const sc::integer transitioned_before) { + /* The reactions of state to go. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[0]) + { + /* Default exit sequence for state prepare */ + /* Default exit sequence for region switch */ + /* Handle exit of all possible states (of TrafficLightStateMachine.trafficlight.operating.r.prepare.switch) at position 0... */ + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + /* Default exit sequence for state to go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to go'. */ + timerService->unsetTimer(shared_from_this(), 0); + redOff_observable.next(); + emit redOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + /* Default exit sequence for state to stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to stop'. */ + timerService->unsetTimer(shared_from_this(), 1); + break; + } + default: + /* do nothing */ + break; + } + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + timeEvents[0] = false; + /* 'default' enter sequence for state go */ + /* Entry action for state 'go'. */ + timerService->setTimer(shared_from_this(), 3, (((sc::time) 3) * 1000), false); + greenOn_observable.next(); + emit greenOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_go; + trafficlight_operating_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_operating_r_prepare_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_r_prepare_switch_to_stop_react(const sc::integer transitioned_before) { + /* The reactions of state to stop. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[1]) + { + /* Default exit sequence for state prepare */ + /* Default exit sequence for region switch */ + /* Handle exit of all possible states (of TrafficLightStateMachine.trafficlight.operating.r.prepare.switch) at position 0... */ + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + /* Default exit sequence for state to go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to go'. */ + timerService->unsetTimer(shared_from_this(), 0); + redOff_observable.next(); + emit redOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + /* Default exit sequence for state to stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to stop'. */ + timerService->unsetTimer(shared_from_this(), 1); + break; + } + default: + /* do nothing */ + break; + } + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + timeEvents[1] = false; + /* 'default' enter sequence for state stop */ + /* Entry action for state 'stop'. */ + timerService->setTimer(shared_from_this(), 2, (((sc::time) 3) * 1000), false); + redOn_observable.next(); + emit redOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_stop; + trafficlight_operating_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_operating_r_prepare_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_r_stop_react(const sc::integer transitioned_before) { + /* The reactions of state stop. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[2]) + { + /* Default exit sequence for state stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'stop'. */ + timerService->unsetTimer(shared_from_this(), 2); + redOff_observable.next(); + emit redOff(); + timeEvents[2] = false; + /* Entry action for state 'prepare'. */ + yellowOn_observable.next(); + emit yellowOn(); + /* 'default' enter sequence for state to go */ + /* Entry action for state 'to go'. */ + timerService->setTimer(shared_from_this(), 0, (((sc::time) 1) * 1000), false); + redOn_observable.next(); + emit redOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go; + trafficlight_operating_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_operating_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_operating_r_go_react(const sc::integer transitioned_before) { + /* The reactions of state go. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[3]) + { + /* Default exit sequence for state go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'go'. */ + timerService->unsetTimer(shared_from_this(), 3); + greenOff_observable.next(); + emit greenOff(); + timeEvents[3] = false; + /* Entry action for state 'prepare'. */ + yellowOn_observable.next(); + emit yellowOn(); + /* 'default' enter sequence for state to stop */ + /* Entry action for state 'to stop'. */ + timerService->setTimer(shared_from_this(), 1, (((sc::time) 1) * 1000), false); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop; + trafficlight_operating_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_operating_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_standby_react(const sc::integer transitioned_before) { + /* The reactions of state standby. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (operate_raised) + { + /* Default exit sequence for state standby */ + /* Default exit sequence for region blink */ + /* Handle exit of all possible states (of TrafficLightStateMachine.trafficlight.standby.blink) at position 0... */ + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_standby_blink_on : + { + /* Default exit sequence for state on */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'on'. */ + timerService->unsetTimer(shared_from_this(), 4); + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_off : + { + /* Default exit sequence for state off */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'off'. */ + timerService->unsetTimer(shared_from_this(), 5); + break; + } + default: + /* do nothing */ + break; + } + /* 'default' enter sequence for state operating */ + /* 'default' enter sequence for region r */ + /* Default react sequence for initial entry */ + /* 'default' enter sequence for state stop */ + /* Entry action for state 'stop'. */ + timerService->setTimer(shared_from_this(), 2, (((sc::time) 3) * 1000), false); + redOn_observable.next(); + emit redOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_stop; + react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_standby_blink_on_react(const sc::integer transitioned_before) { + /* The reactions of state on. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[4]) + { + /* Default exit sequence for state on */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'on'. */ + timerService->unsetTimer(shared_from_this(), 4); + yellowOff_observable.next(); + emit yellowOff(); + timeEvents[4] = false; + /* 'default' enter sequence for state off */ + /* Entry action for state 'off'. */ + timerService->setTimer(shared_from_this(), 5, (((sc::time) 1) * 1000), false); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_standby_blink_off; + trafficlight_standby_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_standby_react(transitioned_before); + } + return transitioned_after; +} + +sc::integer TrafficLightStateMachine::trafficlight_standby_blink_off_react(const sc::integer transitioned_before) { + /* The reactions of state off. */ + sc::integer transitioned_after = transitioned_before; + if ((transitioned_after) < (0)) + { + if (timeEvents[5]) + { + /* Default exit sequence for state off */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'off'. */ + timerService->unsetTimer(shared_from_this(), 5); + timeEvents[5] = false; + /* 'default' enter sequence for state on */ + /* Entry action for state 'on'. */ + timerService->setTimer(shared_from_this(), 4, (((sc::time) 1) * 1000), false); + yellowOn_observable.next(); + emit yellowOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_standby_blink_on; + trafficlight_standby_react(0); + transitioned_after = 0; + } + } + /* If no transition was taken */ + if ((transitioned_after) == (transitioned_before)) + { + /* then execute local reactions. */ + transitioned_after = trafficlight_standby_react(transitioned_before); + } + return transitioned_after; +} + +void TrafficLightStateMachine::clearInEvents() noexcept { + standby_raised = false; + operate_raised = false; + timeEvents[0] = false; + timeEvents[1] = false; + timeEvents[2] = false; + timeEvents[3] = false; + timeEvents[4] = false; + timeEvents[5] = false; +} + +void TrafficLightStateMachine::microStep() { + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + trafficlight_operating_r_prepare_switch_to_go_react(-1); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + trafficlight_operating_r_prepare_switch_to_stop_react(-1); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_stop : + { + trafficlight_operating_r_stop_react(-1); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_go : + { + trafficlight_operating_r_go_react(-1); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_on : + { + trafficlight_standby_blink_on_react(-1); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_off : + { + trafficlight_standby_blink_off_react(-1); + break; + } + default: + /* do nothing */ + break; + } +} + +void TrafficLightStateMachine::runCycle() { + /* Performs a 'run to completion' step. */ + if (isExecuting) + { + return; + } + isExecuting = true; + dispatchEvent(getNextEvent()); + do + { + microStep(); + clearInEvents(); + } while (dispatchEvent(getNextEvent())); + isExecuting = false; +} + +void TrafficLightStateMachine::enter() { + /* Activates the state machine. */ + if (isExecuting) + { + return; + } + isExecuting = true; + /* Default enter sequence for statechart TrafficLightStateMachine */ + /* Entry action for statechart 'TrafficLightStateMachine'. */ + redOff_observable.next(); + emit redOff(); + yellowOff_observable.next(); + emit yellowOff(); + greenOff_observable.next(); + emit greenOff(); + /* 'default' enter sequence for region trafficlight */ + /* Default react sequence for initial entry */ + /* 'default' enter sequence for state operating */ + /* 'default' enter sequence for region r */ + /* Default react sequence for initial entry */ + /* 'default' enter sequence for state stop */ + /* Entry action for state 'stop'. */ + timerService->setTimer(shared_from_this(), 2, (((sc::time) 3) * 1000), false); + redOn_observable.next(); + emit redOn(); + stateConfVector[0] = TrafficLightStateMachine::State::trafficlight_operating_r_stop; + isExecuting = false; +} + +void TrafficLightStateMachine::exit() { + /* Deactivates the state machine. */ + if (isExecuting) + { + return; + } + isExecuting = true; + /* Default exit sequence for statechart TrafficLightStateMachine */ + /* Default exit sequence for region trafficlight */ + /* Handle exit of all possible states (of TrafficLightStateMachine.trafficlight) at position 0... */ + switch(stateConfVector[ 0 ]) + { + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_go : + { + /* Default exit sequence for state to go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to go'. */ + timerService->unsetTimer(shared_from_this(), 0); + redOff_observable.next(); + emit redOff(); + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_prepare_switch_to_stop : + { + /* Default exit sequence for state to stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'to stop'. */ + timerService->unsetTimer(shared_from_this(), 1); + /* Exit action for state 'prepare'. */ + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_stop : + { + /* Default exit sequence for state stop */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'stop'. */ + timerService->unsetTimer(shared_from_this(), 2); + redOff_observable.next(); + emit redOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_operating_r_go : + { + /* Default exit sequence for state go */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'go'. */ + timerService->unsetTimer(shared_from_this(), 3); + greenOff_observable.next(); + emit greenOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_on : + { + /* Default exit sequence for state on */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'on'. */ + timerService->unsetTimer(shared_from_this(), 4); + yellowOff_observable.next(); + emit yellowOff(); + break; + } + case TrafficLightStateMachine::State::trafficlight_standby_blink_off : + { + /* Default exit sequence for state off */ + stateConfVector[0] = TrafficLightStateMachine::State::NO_STATE; + /* Exit action for state 'off'. */ + timerService->unsetTimer(shared_from_this(), 5); + break; + } + default: + /* do nothing */ + break; + } + isExecuting = false; +} + +/* Can be used by the client code to trigger a run to completion step without raising an event. */ +void TrafficLightStateMachine::triggerWithoutEvent() { + runCycle(); +} + diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.h new file mode 100644 index 00000000..f1183278 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/TrafficLightStateMachine.h @@ -0,0 +1,264 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef TRAFFICLIGHTSTATEMACHINE_H_ +#define TRAFFICLIGHTSTATEMACHINE_H_ + +/*! +Forward declaration for the TrafficLightStateMachine state machine. +*/ +class TrafficLightStateMachine; + + +#include +#include "sc_types.h" +#include "sc_rxcpp.h" +#include "sc_statemachine.h" +#include "sc_eventdriven.h" +#include "sc_timer.h" +#include +#include +#include + +/*! \file +Header of the state machine 'TrafficLightStateMachine'. +*/ + + +class TrafficLightStateMachine : public QObject, public sc::timer::TimedInterface, public std::enable_shared_from_this, public sc::EventDrivenInterface +{ + Q_OBJECT + + public: + explicit TrafficLightStateMachine(QObject *parent) noexcept; + + virtual ~TrafficLightStateMachine(); + + + + /*! Enumeration of all states. */ + enum class State + { + NO_STATE, + trafficlight_operating, + trafficlight_operating_r_prepare, + trafficlight_operating_r_prepare_switch_to_go, + trafficlight_operating_r_prepare_switch_to_stop, + trafficlight_operating_r_stop, + trafficlight_operating_r_go, + trafficlight_standby, + trafficlight_standby_blink_on, + trafficlight_standby_blink_off + }; + + /*! The number of states. */ + static constexpr const sc::integer numStates {9}; + static constexpr const sc::integer scvi_trafficlight_operating {0}; + static constexpr const sc::integer scvi_trafficlight_operating_r_prepare {0}; + static constexpr const sc::integer scvi_trafficlight_operating_r_prepare_switch_to_go {0}; + static constexpr const sc::integer scvi_trafficlight_operating_r_prepare_switch_to_stop {0}; + static constexpr const sc::integer scvi_trafficlight_operating_r_stop {0}; + static constexpr const sc::integer scvi_trafficlight_operating_r_go {0}; + static constexpr const sc::integer scvi_trafficlight_standby {0}; + static constexpr const sc::integer scvi_trafficlight_standby_blink_on {0}; + static constexpr const sc::integer scvi_trafficlight_standby_blink_off {0}; + + /*! Enumeration of all events which are consumed. */ + enum class Event + { + NO_EVENT, + standby, + operate, + _te0_trafficlight_operating_r_prepare_switch_to_go_, + _te1_trafficlight_operating_r_prepare_switch_to_stop_, + _te2_trafficlight_operating_r_stop_, + _te3_trafficlight_operating_r_go_, + _te4_trafficlight_standby_blink_on_, + _te5_trafficlight_standby_blink_off_ + }; + + class EventInstance + { + public: + explicit EventInstance(Event id) noexcept : eventId(id){} + virtual ~EventInstance() = default; + const Event eventId; + }; + /*! Get observable for event 'redOn' of default interface scope. */ + sc::rx::Observable& getRedOn() noexcept; + /*! Get observable for event 'redOff' of default interface scope. */ + sc::rx::Observable& getRedOff() noexcept; + /*! Get observable for event 'yellowOn' of default interface scope. */ + sc::rx::Observable& getYellowOn() noexcept; + /*! Get observable for event 'yellowOff' of default interface scope. */ + sc::rx::Observable& getYellowOff() noexcept; + /*! Get observable for event 'greenOn' of default interface scope. */ + sc::rx::Observable& getGreenOn() noexcept; + /*! Get observable for event 'greenOff' of default interface scope. */ + sc::rx::Observable& getGreenOff() noexcept; + + + + /*! Can be used by the client code to trigger a run to completion step without raising an event. */ + void triggerWithoutEvent() override; + /* + * Functions inherited from StatemachineInterface + */ + void enter() override; + + void exit() override; + + /*! + * Checks if the state machine is active (until 2.4.1 this method was used for states). + * A state machine is active if it has been entered. It is inactive if it has not been entered at all or if it has been exited. + */ + bool isActive() const noexcept override; + + + /*! + * Checks if all active states are final. + * If there are no active states then the state machine is considered being inactive. In this case this method returns false. + */ + bool isFinal() const noexcept override; + + /*! + * Checks if member of the state machine must be set. For example an operation callback. + */ + bool check() const noexcept; + + /* + * Functions inherited from TimedStatemachineInterface + */ + void setTimerService(std::shared_ptr timerService_) noexcept override; + + std::shared_ptr getTimerService() noexcept override; + + void raiseTimeEvent(sc::eventid event) override; + + sc::integer getNumberOfParallelTimeEvents() noexcept override; + + + + /*! Checks if the specified state is active (until 2.4.1 the used method for states was calles isActive()). */ + bool isStateActive(State state) const noexcept; + + //! number of time events used by the state machine. + static const sc::integer timeEventsCount {6}; + + //! number of time events that can be active at once. + static const sc::integer parallelTimeEventsCount {1}; + + + public slots: + /*! Slot for the in event 'standby' that is defined in the default interface scope. */ + void standby(); + + /*! Slot for the in event 'operate' that is defined in the default interface scope. */ + void operate(); + + + signals: + /*! Signal representing the out event 'redOn' that is defined in the default interface scope. */ + void redOn(); + + /*! Signal representing the out event 'redOff' that is defined in the default interface scope. */ + void redOff(); + + /*! Signal representing the out event 'yellowOn' that is defined in the default interface scope. */ + void yellowOn(); + + /*! Signal representing the out event 'yellowOff' that is defined in the default interface scope. */ + void yellowOff(); + + /*! Signal representing the out event 'greenOn' that is defined in the default interface scope. */ + void greenOn(); + + /*! Signal representing the out event 'greenOff' that is defined in the default interface scope. */ + void greenOff(); + + + protected: + + + std::deque> incomingEventQueue; + + std::unique_ptr getNextEvent() noexcept; + + bool dispatchEvent(std::unique_ptr event) noexcept; + + + + private: + TrafficLightStateMachine(const TrafficLightStateMachine &rhs); + TrafficLightStateMachine& operator=(const TrafficLightStateMachine&); + + + + + + + //! the maximum number of orthogonal states defines the dimension of the state configuration vector. + static const sc::ushort maxOrthogonalStates {1}; + + std::shared_ptr timerService; + bool timeEvents[timeEventsCount]; + + + State stateConfVector[maxOrthogonalStates]; + + + + + bool isExecuting {false}; + + + + // prototypes of all internal functions + + sc::integer react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_r_prepare_react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_r_prepare_switch_to_go_react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_r_prepare_switch_to_stop_react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_r_stop_react(const sc::integer transitioned_before); + sc::integer trafficlight_operating_r_go_react(const sc::integer transitioned_before); + sc::integer trafficlight_standby_react(const sc::integer transitioned_before); + sc::integer trafficlight_standby_blink_on_react(const sc::integer transitioned_before); + sc::integer trafficlight_standby_blink_off_react(const sc::integer transitioned_before); + void clearInEvents() noexcept; + void microStep(); + void runCycle(); + + + + /*! Observable for event 'redOn' of default interface scope. */ + sc::rx::Observable redOn_observable = sc::rx::Observable{}; + + /*! Observable for event 'redOff' of default interface scope. */ + sc::rx::Observable redOff_observable = sc::rx::Observable{}; + + /*! Observable for event 'yellowOn' of default interface scope. */ + sc::rx::Observable yellowOn_observable = sc::rx::Observable{}; + + /*! Observable for event 'yellowOff' of default interface scope. */ + sc::rx::Observable yellowOff_observable = sc::rx::Observable{}; + + /*! Observable for event 'greenOn' of default interface scope. */ + sc::rx::Observable greenOn_observable = sc::rx::Observable{}; + + /*! Observable for event 'greenOff' of default interface scope. */ + sc::rx::Observable greenOff_observable = sc::rx::Observable{}; + + /*! Indicates event 'standby' of default interface scope is active. */ + bool standby_raised {false}; + + /*! Indicates event 'operate' of default interface scope is active. */ + bool operate_raised {false}; + + + +}; + + + + +#endif /* TRAFFICLIGHTSTATEMACHINE_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_cyclebased.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_cyclebased.h new file mode 100644 index 00000000..41687478 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_cyclebased.h @@ -0,0 +1,28 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_CYCLEBASED_H_ +#define SC_CYCLEBASED_H_ + +#include "sc_statemachine.h" + +namespace sc { + +/*! \file +Interface for cycle-based state machines. +*/ +class CycleBasedInterface : public sc::StatemachineInterface +{ + public: + + virtual ~CycleBasedInterface() = 0; + + /*! Start a run-to-completion cycle. + */ + virtual void runCycle() = 0; +}; + +inline CycleBasedInterface::~CycleBasedInterface() {} + +} /* namespace sc */ + +#endif /* SC_CYCLEBASED_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_eventdriven.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_eventdriven.h new file mode 100644 index 00000000..7452d471 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_eventdriven.h @@ -0,0 +1,28 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_EVENTDRIVEN_H_ +#define SC_EVENTDRIVEN_H_ + +#include "sc_statemachine.h" + +namespace sc { + +/*! \file +Interface for event-driven state machines. +*/ +class EventDrivenInterface : public sc::StatemachineInterface +{ + public: + + virtual ~EventDrivenInterface() = 0; + + /*! Start a run-to-completion step without any event. + */ + virtual void triggerWithoutEvent() = 0; +}; + +inline EventDrivenInterface::~EventDrivenInterface() {} + +} /* namespace sc */ + +#endif /* SC_EVENTDRIVEN_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.cpp b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.cpp new file mode 100644 index 00000000..cb5f278e --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.cpp @@ -0,0 +1,119 @@ +/** Generated by itemis CREATE code generator. */ + +#include "sc_qt_timerservice.h" + + +using namespace sc::qt; + + +SCTimer::SCTimer(QObject *parent, std::weak_ptr machine, const sc::eventid id) : + machine(machine), + eventId(id) +{ + connect(this, SIGNAL(timeout()), this, SLOT(triggerTimeEvent())); +} + +void SCTimer::triggerTimeEvent() +{ + emit fireTimeEvent(machine.lock(), eventId); +} + +SCTimer::~SCTimer() +{ +} + +SCTimerService::SCTimerService(QObject *parent) +{ +} + +SCTimerService::~SCTimerService() +{ +} + +void SCTimerService::setTimer(std::shared_ptr statemachine, sc::eventid event, sc::time time_ms, bool isPeriodic) +{ + std::shared_ptr timer = nullptr; + + // retrieve the timer map for the state machine + QMap> *eventTimerMap = machineTimerMapMap.value(statemachine); + + // retrieve and stop a timer if it already exists for the event. + if (eventTimerMap != nullptr) { + + if (eventTimerMap->contains(event)) { + std::shared_ptr timer = eventTimerMap->value(event); + timer->stop(); + } + } + + //setup the event timer map for the state machine if it not alrewady exists + if ( eventTimerMap == nullptr) { + eventTimerMap = new QMap>(); + machineTimerMapMap.insert(statemachine, eventTimerMap); + } + + // create a timer if it not already exists + if (timer == nullptr) { + timer = std::make_shared(this, statemachine, event); + eventTimerMap->insert(event, timer); + timer->connect(timer.get(), SIGNAL(fireTimeEvent(std::shared_ptr,sc::eventid)), this, SLOT(raiseTimeEvent(std::shared_ptr,sc::eventid))); + } + + // amor the timer + timer->setTimerType(Qt::TimerType::PreciseTimer); + timer->setInterval(time_ms); + timer->setSingleShot(!isPeriodic); + timer->start(); + +} + + +std::shared_ptr SCTimerService::getTimer(std::shared_ptr machine, sc::eventid event) +{ + std::shared_ptr timer = nullptr; + + // retrieve the timer map for the state machine + QMap> *eventTimerMap = machineTimerMapMap.value(machine); + + // retrieve and a timer registered for the event. + if (eventTimerMap != nullptr) { + + if (eventTimerMap->contains(event)) { + timer = eventTimerMap->value(event); + } + } + + return timer; +} + + +void SCTimerService::unsetTimer(std::shared_ptr statemachine, sc::eventid event) +{ + std::shared_ptr timer = this->getTimer(statemachine, event); + + if (timer != nullptr) { + timer->stop(); + } + + // do nothing else as the timer may be reused... +} + + +void SCTimerService::raiseTimeEvent(std::shared_ptr machine, sc::eventid event) +{ + std::shared_ptr timer = this->getTimer(machine, event); + if (timer != nullptr && timer->isSingleShot()) { + timer->stop(); + } + + if (machine != nullptr) { + machine->raiseTimeEvent(event); + } +} + + +void SCTimerService::cancel() +{ +} + + diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.h new file mode 100644 index 00000000..d6059937 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_qt_timerservice.h @@ -0,0 +1,73 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_QT_TIMERSERVICE_H_ +#define SC_QT_TIMERSERVICE_H_ + + +#include +#include +#include +#include + +#include "sc_timer.h" + + +namespace sc +{ + +namespace qt +{ + + class SCTimer : public QTimer + { + Q_OBJECT + + public: + explicit SCTimer(QObject * parent, std::weak_ptr machine, const sc::eventid id); + + virtual ~SCTimer(); + + signals: + void fireTimeEvent(std::shared_ptr machine, sc::eventid event); + + public slots: + void triggerTimeEvent(); + + protected: + std::weak_ptr machine; + sc::eventid eventId; + }; + + + + class SCTimerService : public QObject, public sc::timer::TimerServiceInterface + { + Q_OBJECT + + public: + explicit SCTimerService(QObject *parent); + + virtual ~SCTimerService(); + + virtual void setTimer(std::shared_ptr statemachine, sc::eventid event, sc::time time_ms, bool isPeriodic); + virtual void unsetTimer(std::shared_ptr statemachine, sc::eventid event); + virtual void cancel(); + + signals: + + public slots: + void raiseTimeEvent(std::shared_ptr machine, sc::eventid event); + + protected: + QMap,QMap>*> machineTimerMapMap; + std::shared_ptr getTimer(std::shared_ptr machine, sc::eventid event); + + }; + +} // namespace qt + +} // namespace sc + +#endif // SC_QT_TIMERSERVICE_H_ + + diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_rxcpp.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_rxcpp.h new file mode 100644 index 00000000..b1e5429c --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_rxcpp.h @@ -0,0 +1,165 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_RXCPP_H_ +#define SC_RXCPP_H_ + +#include "sc_types.h" +#include +#include +#include +#include + +namespace sc { +namespace rx { + +template class Observer; +template<> class Observer ; +template class subscription; +template class Observable; +template<> class Observable ; + +template +class Observer { +public: + virtual ~Observer() { + } + virtual void next(T value) = 0; +}; + +template<> +class Observer { +public: + virtual ~Observer() { + } + virtual void next() = 0; +}; + +template +class SingleSubscriptionObserver: public Observer { +public: + SingleSubscriptionObserver() noexcept { + } + + bool subscribe(sc::rx::Observable &o) noexcept { + return o.subscribe(subscription); + } + + bool unsubscribe(sc::rx::Observable &o) noexcept { + return o.unsubscribe(subscription); + } + + void setSubscription(sc::rx::subscription &s) noexcept { + subscription = s; + } + + virtual ~SingleSubscriptionObserver() = default; + +protected: + sc::rx::subscription subscription; +}; + +template +class subscription { +protected: + std::shared_ptr > > observer; +public: + subscription() noexcept : observer(nullptr) { + } + + subscription(Observer &o) noexcept : + observer(std::make_shared > >(o)) { + } + + bool operator==(const subscription &other) const noexcept{ + return observer == other.observer; + } + + bool operator!=(const subscription &other) const noexcept { + return !(*this == other); + } + + Observer &operator*() const noexcept { + return observer->get(); + } + + Observer *operator->() const noexcept { + return &(observer->get()); + } + + operator bool() const noexcept { + return observer.get() != nullptr; + } + + virtual ~subscription() = default; +}; + +template class ObservableBase { +public: + ObservableBase() noexcept + { + } + + bool subscribe(subscription &s) noexcept { + if (s && std::find(this->subscriptions.begin(), this->subscriptions.end(), s) == this->subscriptions.end()) { + this->subscriptions.push_back(s); + return true; + } + return false; + } + + bool unsubscribe(subscription &s) noexcept { + if (!this->subscriptions.empty()) { + auto old_end = this->subscriptions.end(); + this->subscriptions.erase(std::remove(this->subscriptions.begin(), this->subscriptions.end(), s), this->subscriptions.end()); + if(std::distance(old_end, this->subscriptions.end()) != 0){ + return true; + } + return false; + } + return false; + } + + virtual ~ObservableBase() = default; + +protected: + std::vector> subscriptions; + +}; + +template +class Observable: public ObservableBase { + +public: + + void next(T value) { + for (auto sub = this->subscriptions.begin() ; sub != this->subscriptions.end(); ++sub){ + if (*sub) { + (*sub)->next(value); + } + } + } + + virtual ~Observable() = default; + +}; + +template<> +class Observable : public ObservableBase { + +public: + void next() { + for (auto sub = this->subscriptions.begin() ; sub != this->subscriptions.end(); ++sub){ + if (*sub) { + (*sub)->next(); + } + } + } + + virtual ~Observable() = default; + +}; + +} /* namespace sc::rx */ +} /* namespace sc */ + +#endif /* SC_RXCPP_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_statemachine.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_statemachine.h new file mode 100644 index 00000000..c5081e21 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_statemachine.h @@ -0,0 +1,44 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_STATEMACHINE_H_ +#define SC_STATEMACHINE_H_ + +namespace sc { + +/*! \file +Basic interface for state machines. +*/ +class StatemachineInterface +{ + public: + + virtual ~StatemachineInterface() = 0; + + /*! + Enters the state machine. Sets the state machine into a defined state. + */ + virtual void enter() = 0; + + /*! + Exits the state machine. Leaves the state machine with a defined state. + */ + virtual void exit() = 0; + + /*! + Checks whether the state machine is active. + A state machine is active if it has been entered. It is inactive if it has not been entered at all or if it has been exited. + */ + virtual bool isActive() const = 0; + + /*! + Checks if all active states are final. + If there are no active states then the state machine is considered being inactive. In this case this method returns false. + */ + virtual bool isFinal() const = 0; +}; + +inline StatemachineInterface::~StatemachineInterface() {} + +} /* namespace sc */ + +#endif /* SC_STATEMACHINE_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_timer.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_timer.h new file mode 100644 index 00000000..d450ef18 --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_timer.h @@ -0,0 +1,75 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_TIMER_H_ +#define SC_TIMER_H_ + +#include "sc_types.h" +#include +#include + +namespace sc { +namespace timer { + +class TimedInterface; +class TimerServiceInterface; + +/*! \file +Interface for state machines which use timed event triggers. +*/ +class TimedInterface { + public: + + virtual ~TimedInterface() = 0; + + /*! + Set the timer service for the state machine. It must be set + externally on a timed state machine before a run cycle can be executed. + */ + virtual void setTimerService(std::shared_ptr timerService) = 0; + + /*! + Return the currently used timer service. + */ + virtual std::shared_ptr getTimerService() = 0; + + /*! + Callback method if a time event occurred. + */ + virtual void raiseTimeEvent(sc::eventid event) = 0; + + /*! + Retrieve the number of time events that can be active at once in this state machine. + */ + virtual sc::integer getNumberOfParallelTimeEvents() = 0; + +}; + +inline TimedInterface::~TimedInterface() {} + + +/*! \file +Timer service interface. +*/ +class TimerServiceInterface +{ + public: + + virtual ~TimerServiceInterface() = 0; + + /*! + Starts the timing for a time event. + */ + virtual void setTimer(std::shared_ptr statemachine, sc::eventid event, sc::time time_ms, bool isPeriodic) = 0; + + /*! + Unsets the given time event. + */ + virtual void unsetTimer(std::shared_ptr statemachine, sc::eventid event) = 0; +}; + +inline TimerServiceInterface::~TimerServiceInterface() {} + +} /* namespace sc::timer */ +} /* namespace sc */ + +#endif /* SC_TIMER_H_ */ diff --git a/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_types.h b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_types.h new file mode 100644 index 00000000..b671e95f --- /dev/null +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/machine/sc_types.h @@ -0,0 +1,26 @@ +/** Generated by itemis CREATE code generator. */ + +#ifndef SC_TYPES_H_ +#define SC_TYPES_H_ + +/* As is not available on all platforms we choose to include . You can switch to by commenting and uncommenting the lines below.*/ +// #include +#include + +#include + +namespace sc { + +// typedef int_fast16_t short; +typedef uint_fast16_t ushort; +typedef int32_t integer; +typedef int16_t errorCode; +typedef double real; + +typedef int32_t time; + +typedef uint_fast16_t eventid; + +} + +#endif /* SC_TYPES_H_ */ diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/main.cpp b/itemis.create.examples.trafficlight.cpp.qt/implementation/main.cpp similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/main.cpp rename to itemis.create.examples.trafficlight.cpp.qt/implementation/main.cpp diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/main.qml b/itemis.create.examples.trafficlight.cpp.qt/implementation/main.qml similarity index 97% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/main.qml rename to itemis.create.examples.trafficlight.cpp.qt/implementation/main.qml index 9c8aa615..5daebee7 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/main.qml +++ b/itemis.create.examples.trafficlight.cpp.qt/implementation/main.qml @@ -5,7 +5,7 @@ Window { visible: true width: 400 height: 400 - title: qsTr("YAKINDU Qt/C++ Traffic Light State Machine") + title: qsTr("CREATE Qt/C++ Traffic Light State Machine") Image { id: trafficLight diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/qml.qrc b/itemis.create.examples.trafficlight.cpp.qt/implementation/qml.qrc similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/qml.qrc rename to itemis.create.examples.trafficlight.cpp.qt/implementation/qml.qrc diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/trafficlight-qt-cpp.pro b/itemis.create.examples.trafficlight.cpp.qt/implementation/trafficlight-qt-cpp.pro similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/implementation/trafficlight-qt-cpp.pro rename to itemis.create.examples.trafficlight.cpp.qt/implementation/trafficlight-qt-cpp.pro diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/index.html b/itemis.create.examples.trafficlight.cpp.qt/index.html similarity index 93% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/index.html rename to itemis.create.examples.trafficlight.cpp.qt/index.html index 8da038a6..3f671b87 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/index.html +++ b/itemis.create.examples.trafficlight.cpp.qt/index.html @@ -10,8 +10,8 @@

    Qt/C++ State Machine of a Traffic Light

    - YAKINDU provides a Qt specific C++ code generator for statecharts. - This example project shows how easy YAKINDU Qt/C++ state machines can be integrated + CREATE provides a Qt specific C++ code generator for statecharts. + This example project shows how easy CREATE Qt/C++ state machines can be integrated into Qt applications.

    @@ -81,16 +81,16 @@

    Generating state machine code

    Feel free to play around with the the traffic light and its statechart. When you modify the statechart the code generator will automatically run and regenerate the sources that you can find in the implementation/machine folder. - Also the synchronization between YAKINDU and Qt-Creator works painless. + Also the synchronization between CREATE and Qt-Creator works painless. After generating the code, Qt-Creator may ask you to synchronize the new versions of the implementation files. Simply confirm and rebuild the project - that's it.

    Installing the Qt/C++ code generator

    - If code generation does not work and YAKINDU shows error markers on the + If code generation does not work and CREATE shows error markers on the model/TrafficLightStateMachine.sgen file then you likely have to install the - YAKINDU Qt/C++ code generator. + CREATE Qt/C++ code generator.

    1. Open Help > Install New Software ... from the menu.
    2. diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/metadata.json b/itemis.create.examples.trafficlight.cpp.qt/metadata.json similarity index 60% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/metadata.json rename to itemis.create.examples.trafficlight.cpp.qt/metadata.json index 8f4eb81f..93f172a6 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/metadata.json +++ b/itemis.create.examples.trafficlight.cpp.qt/metadata.json @@ -1,7 +1,7 @@ { - "id": "org.yakindu.sct.examples.trafficlight.cpp.qt", + "id": "itemis.create.examples.trafficlight.cpp.qt", "title": "Traffic Light (Qt/C++)", - "description": "YAKINDU provides a Qt specific C++ code generator for statecharts. This example project shows how easy YAKINDU Qt/C++ state machines can be integrated into Qt applications.", + "description": "CREATE provides a Qt specific C++ code generator for statecharts. This example project shows how easy CREATE Qt/C++ state machines can be integrated into Qt applications.", "previewImage": "traffic_light.jpg", "author": "itemis AG", "license": "GNU Free Documentation License version 1.3", diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen b/itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen similarity index 90% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen rename to itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen index 710e5f7f..554d1cb1 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen +++ b/itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.sgen @@ -2,7 +2,7 @@ GeneratorModel for yakindu::cpp::qt { statechart TrafficLightStateMachine { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.cpp.qt" + targetProject = "itemis.create.examples.trafficlight.cpp.qt" targetFolder = "implementation/machine" } diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc b/itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc rename to itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc index 8921fa8c..390546c2 100644 --- a/org.yakindu.sct.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc +++ b/itemis.create.examples.trafficlight.cpp.qt/model/TrafficLightStateMachine.ysc @@ -45,7 +45,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.java/.classpath b/itemis.create.examples.trafficlight.java/.classpath similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/.classpath rename to itemis.create.examples.trafficlight.java/.classpath diff --git a/org.yakindu.sct.examples.trafficlight.java/.gitignore b/itemis.create.examples.trafficlight.java/.gitignore similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/.gitignore rename to itemis.create.examples.trafficlight.java/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.java/.project b/itemis.create.examples.trafficlight.java/.project similarity index 92% rename from org.yakindu.sct.examples.trafficlight.java/.project rename to itemis.create.examples.trafficlight.java/.project index 403e688e..84817734 100644 --- a/org.yakindu.sct.examples.trafficlight.java/.project +++ b/itemis.create.examples.trafficlight.java/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.java + itemis.create.examples.trafficlight.java diff --git a/org.yakindu.sct.examples.trafficlight.c.arduino/css/style.css b/itemis.create.examples.trafficlight.java/css/style.css similarity index 100% rename from org.yakindu.sct.examples.trafficlight.c.arduino/css/style.css rename to itemis.create.examples.trafficlight.java/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.java/images/application-code.png b/itemis.create.examples.trafficlight.java/images/application-code.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/images/application-code.png rename to itemis.create.examples.trafficlight.java/images/application-code.png diff --git a/org.yakindu.sct.examples.trafficlight.java/images/genmodel.png b/itemis.create.examples.trafficlight.java/images/genmodel.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/images/genmodel.png rename to itemis.create.examples.trafficlight.java/images/genmodel.png diff --git a/org.yakindu.sct.examples.trafficlight.java/images/gui.png b/itemis.create.examples.trafficlight.java/images/gui.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/images/gui.png rename to itemis.create.examples.trafficlight.java/images/gui.png diff --git a/org.yakindu.sct.examples.trafficlight.java/images/statechart.png b/itemis.create.examples.trafficlight.java/images/statechart.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/images/statechart.png rename to itemis.create.examples.trafficlight.java/images/statechart.png diff --git a/com.yakindu.sct.examples.trafficlight.multism/images/traffic_light_thumb.jpg b/itemis.create.examples.trafficlight.java/images/traffic_light_thumb.jpg similarity index 100% rename from com.yakindu.sct.examples.trafficlight.multism/images/traffic_light_thumb.jpg rename to itemis.create.examples.trafficlight.java/images/traffic_light_thumb.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/index.html b/itemis.create.examples.trafficlight.java/index.html similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/index.html rename to itemis.create.examples.trafficlight.java/index.html diff --git a/org.yakindu.sct.examples.trafficlight.java/metadata.json b/itemis.create.examples.trafficlight.java/metadata.json similarity index 69% rename from org.yakindu.sct.examples.trafficlight.java/metadata.json rename to itemis.create.examples.trafficlight.java/metadata.json index c9422ab6..752c0fd2 100644 --- a/org.yakindu.sct.examples.trafficlight.java/metadata.json +++ b/itemis.create.examples.trafficlight.java/metadata.json @@ -1,8 +1,8 @@ { - "id": "org.yakindu.sct.examples.trafficlight.java", + "id": "itemis.create.examples.trafficlight.java", "title": "Traffic Light (Java)", "author": "itemis AG", - "description": "Demonstrates how to to generate Java source code from a statechart. The procedure is actually explained in the YAKINDU Statechart Tools documentation, section \"Java code generator\".", + "description": "Demonstrates how to to generate Java source code from a statechart. The procedure is actually explained in the Itemis CREATE documentation, section \"Java code generator\".", "previewImage": "traffic_light_thumb.jpg", "category": [ "open source", diff --git a/org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.sgen b/itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.sgen similarity index 82% rename from org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.sgen rename to itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.sgen index 4144868d..29ee4115 100644 --- a/org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.sgen +++ b/itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::java { statechart TrafficLightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.java" + targetProject = "itemis.create.examples.trafficlight.java" targetFolder = "src-gen" } diff --git a/org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.ysc b/itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.ysc rename to itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.ysc index 6680cb80..c8bd06e5 100644 --- a/org.yakindu.sct.examples.trafficlight.java/model/TrafficLightCtrl.ysc +++ b/itemis.create.examples.trafficlight.java/model/TrafficLightCtrl.ysc @@ -77,7 +77,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/TrafficLightCtrl.png b/itemis.create.examples.trafficlight.java/resources/images/TrafficLightCtrl.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/TrafficLightCtrl.png rename to itemis.create.examples.trafficlight.java/resources/images/TrafficLightCtrl.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/counter.jpg b/itemis.create.examples.trafficlight.java/resources/images/counter.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/counter.jpg rename to itemis.create.examples.trafficlight.java/resources/images/counter.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/counter_empty.png b/itemis.create.examples.trafficlight.java/resources/images/counter_empty.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/counter_empty.png rename to itemis.create.examples.trafficlight.java/resources/images/counter_empty.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/counter_empty.svg b/itemis.create.examples.trafficlight.java/resources/images/counter_empty.svg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/counter_empty.svg rename to itemis.create.examples.trafficlight.java/resources/images/counter_empty.svg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/green_light.png b/itemis.create.examples.trafficlight.java/resources/images/green_light.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/green_light.png rename to itemis.create.examples.trafficlight.java/resources/images/green_light.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/green_light.xcf b/itemis.create.examples.trafficlight.java/resources/images/green_light.xcf similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/green_light.xcf rename to itemis.create.examples.trafficlight.java/resources/images/green_light.xcf diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar.png b/itemis.create.examples.trafficlight.java/resources/images/horizontal_bar.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar.png rename to itemis.create.examples.trafficlight.java/resources/images/horizontal_bar.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar.svg b/itemis.create.examples.trafficlight.java/resources/images/horizontal_bar.svg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar.svg rename to itemis.create.examples.trafficlight.java/resources/images/horizontal_bar.svg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar_green.png b/itemis.create.examples.trafficlight.java/resources/images/horizontal_bar_green.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar_green.png rename to itemis.create.examples.trafficlight.java/resources/images/horizontal_bar_green.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar_green.svg b/itemis.create.examples.trafficlight.java/resources/images/horizontal_bar_green.svg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/horizontal_bar_green.svg rename to itemis.create.examples.trafficlight.java/resources/images/horizontal_bar_green.svg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/red_light.png b/itemis.create.examples.trafficlight.java/resources/images/red_light.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/red_light.png rename to itemis.create.examples.trafficlight.java/resources/images/red_light.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/red_light.xcf b/itemis.create.examples.trafficlight.java/resources/images/red_light.xcf similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/red_light.xcf rename to itemis.create.examples.trafficlight.java/resources/images/red_light.xcf diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight.jpg b/itemis.create.examples.trafficlight.java/resources/images/trafficlight.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight.jpg rename to itemis.create.examples.trafficlight.java/resources/images/trafficlight.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_empty.jpg b/itemis.create.examples.trafficlight.java/resources/images/trafficlight_empty.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_empty.jpg rename to itemis.create.examples.trafficlight.java/resources/images/trafficlight_empty.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_green.jpg b/itemis.create.examples.trafficlight.java/resources/images/trafficlight_green.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_green.jpg rename to itemis.create.examples.trafficlight.java/resources/images/trafficlight_green.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_red.jpg b/itemis.create.examples.trafficlight.java/resources/images/trafficlight_red.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_red.jpg rename to itemis.create.examples.trafficlight.java/resources/images/trafficlight_red.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_yellow.jpg b/itemis.create.examples.trafficlight.java/resources/images/trafficlight_yellow.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/trafficlight_yellow.jpg rename to itemis.create.examples.trafficlight.java/resources/images/trafficlight_yellow.jpg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar.png b/itemis.create.examples.trafficlight.java/resources/images/vertical_bar.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar.png rename to itemis.create.examples.trafficlight.java/resources/images/vertical_bar.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar.svg b/itemis.create.examples.trafficlight.java/resources/images/vertical_bar.svg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar.svg rename to itemis.create.examples.trafficlight.java/resources/images/vertical_bar.svg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar_green.png b/itemis.create.examples.trafficlight.java/resources/images/vertical_bar_green.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar_green.png rename to itemis.create.examples.trafficlight.java/resources/images/vertical_bar_green.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar_green.svg b/itemis.create.examples.trafficlight.java/resources/images/vertical_bar_green.svg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/vertical_bar_green.svg rename to itemis.create.examples.trafficlight.java/resources/images/vertical_bar_green.svg diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/yellow_light.png b/itemis.create.examples.trafficlight.java/resources/images/yellow_light.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/yellow_light.png rename to itemis.create.examples.trafficlight.java/resources/images/yellow_light.png diff --git a/org.yakindu.sct.examples.trafficlight.java/resources/images/yellow_light.xcf b/itemis.create.examples.trafficlight.java/resources/images/yellow_light.xcf similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/resources/images/yellow_light.xcf rename to itemis.create.examples.trafficlight.java/resources/images/yellow_light.xcf diff --git a/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IEventDriven.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IEventDriven.java new file mode 100644 index 00000000..94a2cd9b --- /dev/null +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IEventDriven.java @@ -0,0 +1,13 @@ +/** Generated by itemis CREATE code generator. */ +package com.yakindu.core; + +/** + * Interface for event-driven state machines. + */ +public interface IEventDriven extends IStatemachine { + + /** + * Start a run-to-completion step without any event. + */ + public void triggerWithoutEvent(); +} diff --git a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/IStatemachine.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IStatemachine.java similarity index 84% rename from org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/IStatemachine.java rename to itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IStatemachine.java index 01a10450..b96c671e 100644 --- a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/IStatemachine.java +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/IStatemachine.java @@ -1,4 +1,4 @@ -/** Generated by YAKINDU Statechart Tools code generator. */ +/** Generated by itemis CREATE code generator. */ package com.yakindu.core; /** @@ -24,7 +24,7 @@ public interface IStatemachine { /** * Checks whether all active states are final. - * If there are no active states then the state machine is considered being incative. In this case this method returns false. + * If there are no active states then the state machine is considered being inactive. In this case this method returns false. */ public boolean isFinal(); } diff --git a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimed.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimed.java similarity index 90% rename from org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimed.java rename to itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimed.java index c64e8f7f..2ac855d0 100644 --- a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimed.java +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimed.java @@ -1,4 +1,4 @@ -/** Generated by YAKINDU Statechart Tools code generator. */ +/** Generated by itemis CREATE code generator. */ package com.yakindu.core; /** diff --git a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimerService.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimerService.java similarity index 93% rename from org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimerService.java rename to itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimerService.java index acfd55ab..df9480dc 100644 --- a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/ITimerService.java +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/ITimerService.java @@ -1,4 +1,4 @@ -/** Generated by YAKINDU Statechart Tools code generator. */ +/** Generated by itemis CREATE code generator. */ package com.yakindu.core; /** diff --git a/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/TimerService.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/TimerService.java new file mode 100644 index 00000000..49299ff8 --- /dev/null +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/TimerService.java @@ -0,0 +1,110 @@ +/** Generated by itemis CREATE code generator. */ +package com.yakindu.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Default timer service implementation. + * + */ +public class TimerService implements ITimerService { + + private final Timer timer = new Timer(); + + private final List timerTaskList = new ArrayList(); + + private final Lock lock = new ReentrantLock(); + + /** + * Timer task that reflects a time event. It's internally used by + * {@link TimerService}. + * + */ + private class TimeEventTask extends TimerTask { + + private ITimed callback; + + int eventID; + + /** + * Constructor for a time event. + * + * @param callback an ITimed object that is called when the timer expires + * @param eventID the id of the state machine's time event + */ + public TimeEventTask(ITimed callback, int eventID) { + this.callback = callback; + this.eventID = eventID; + } + + public void run() { + callback.raiseTimeEvent(eventID); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TimeEventTask) { + return ((TimeEventTask) obj).callback.equals(callback) + && ((TimeEventTask) obj).eventID == eventID; + } + return super.equals(obj); + } + + @Override + public int hashCode() { + int prime = 37; + int result = 1; + + int c = (int) this.eventID; + result = prime * result + c; + c = this.callback.hashCode(); + result = prime * result + c; + return result; + } + + } + + public void setTimer(final ITimed callback, final int eventID, + long time, boolean isPeriodic) { + + // Create a new TimerTask for given event and store it. + TimeEventTask timerTask = new TimeEventTask(callback, eventID); + lock.lock(); + timerTaskList.add(timerTask); + + // start scheduling the timer + if (isPeriodic) { + timer.scheduleAtFixedRate(timerTask, time, time); + } else { + timer.schedule(timerTask, time); + } + lock.unlock(); + } + + public void unsetTimer(ITimed callback, int eventID) { + lock.lock(); + int index = timerTaskList.indexOf(new TimeEventTask(callback, eventID)); + if (index != -1) { + timerTaskList.get(index).cancel(); + timer.purge(); + timerTaskList.remove(index); + } + lock.unlock(); + } + + /** + * Cancel timer service. Use this to end possible timing threads and free + * memory resources. + */ + public void cancel() { + lock.lock(); + timer.cancel(); + timer.purge(); + lock.unlock(); + } +} diff --git a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/VirtualTimer.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/VirtualTimer.java similarity index 67% rename from org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/VirtualTimer.java rename to itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/VirtualTimer.java index 9e6a4821..bb0a1106 100644 --- a/org.yakindu.sct.examples.sctunit.java/src-gen/com/yakindu/core/VirtualTimer.java +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/VirtualTimer.java @@ -1,37 +1,41 @@ -/** Generated by YAKINDU Statechart Tools code generator. */ +/** Generated by itemis CREATE code generator. */ package com.yakindu.core; +import java.math.BigInteger; import java.util.PriorityQueue; import java.util.Queue; public class VirtualTimer implements ITimerService { - private long stopTime = 0; - protected long currentTime = 0; + private BigInteger stopTime = BigInteger.ZERO; + protected BigInteger currentTime = BigInteger.ZERO; protected long cyclePeriod = 0; - protected long scheduleCount = 0; + protected BigInteger scheduleCount = BigInteger.ZERO; private Queue tasks; public abstract static class VirtualTimeTask implements Runnable, Comparable { - long nextExecutionTime = 0; + BigInteger nextExecutionTime = BigInteger.ZERO; long interval = 0; long period = -1; - long scheduleOrder = 0; + BigInteger scheduleOrder = BigInteger.ZERO; boolean isCanceled = false; public int compareTo(VirtualTimeTask o) { - if (nextExecutionTime != o.nextExecutionTime) { - return (int) (nextExecutionTime - o.nextExecutionTime); + + BigInteger diff = BigInteger.ZERO; + + if (!nextExecutionTime.equals(o.nextExecutionTime)) { + diff = nextExecutionTime.subtract(o.nextExecutionTime); } else if (o instanceof CycleTimeEventTask && !(this instanceof CycleTimeEventTask)) { return -1; } else if (!(o instanceof CycleTimeEventTask) && this instanceof CycleTimeEventTask) { return 1; - } else if (period != o.period) { - return (int) (period - o.period); - } - return (int) (scheduleOrder - o.scheduleOrder); + } else { + diff = scheduleOrder.subtract(o.scheduleOrder); + } + return diff.compareTo(BigInteger.ZERO); } public boolean isCanceled() { @@ -69,9 +73,9 @@ public void run() { public static class CycleTimeEventTask extends VirtualTimeTask { - private IStatemachine statemachine; + private IEventDriven statemachine; - public CycleTimeEventTask(IStatemachine statemachine) { + public CycleTimeEventTask(IEventDriven statemachine) { this.statemachine = statemachine; } @@ -90,13 +94,22 @@ public VirtualTimer(long cyclePeriod) { } public void timeLeap(long ms) { - stopTime = currentTime + ms; + stopTime = currentTime.add(BigInteger.valueOf(ms)); processTasks(); } public void cycleLeap(long cycles){ - for(int i = 1; i<=cycles; i++){ - timeLeap(cyclePeriod); + int elapsedCycles = 0; + + while (elapsedCycles < cycles) { + + VirtualTimeTask cycleTask = getCycleTask(); + if (cycleTask == null) + return; + + long timeToNextCycle = cycleTask.nextExecutionTime.subtract(currentTime).longValue(); + timeLeap(timeToNextCycle); + elapsedCycles += 1; } } @@ -121,18 +134,18 @@ public void unsetTimer(ITimed callback, int eventID) { public void scheduleTask(VirtualTimeTask task, long interval) { task.interval = interval; - scheduleInternal(task, currentTime + interval, -1); + scheduleInternal(task, currentTime.add(BigInteger.valueOf(interval)), -1); } public void schedulePeriodicalTask(VirtualTimeTask task, long interval, long period) { - scheduleInternal(task, currentTime + interval, period); + scheduleInternal(task, currentTime.add(BigInteger.valueOf(interval)), period); } - private void scheduleInternal(VirtualTimeTask task, long time, long period) { + private void scheduleInternal(VirtualTimeTask task, BigInteger time, long period) { task.nextExecutionTime = time; task.period = period; task.scheduleOrder = scheduleCount; - scheduleCount++; + scheduleCount = scheduleCount.add(BigInteger.ONE); tasks.add(task); } @@ -146,7 +159,16 @@ protected VirtualTimeTask getTask(ITimed callback, int eventName) { } return null; } - + + protected CycleTimeEventTask getCycleTask() { + for (VirtualTimeTask task : tasks) { + if (task instanceof CycleTimeEventTask && !task.isCanceled()) { + return (CycleTimeEventTask) task; + } + } + return null; + } + protected void processTasks() { boolean processTasks = !tasks.isEmpty(); while (processTasks) { @@ -157,14 +179,15 @@ protected void processTasks() { tasks.remove(); continue; } - - if (task.nextExecutionTime <= stopTime) { + + if (task.nextExecutionTime.compareTo(stopTime) <= 0) { currentTime = task.nextExecutionTime; task = tasks.poll(); - task.run(); if (task.period > -1) { - schedulePeriodicalTask(task, task.period, task.period); + task.nextExecutionTime = currentTime.add(BigInteger.valueOf(task.period)); + tasks.add(task); } + task.run(); } else { currentTime = stopTime; processTasks = false; diff --git a/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observable.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observable.java new file mode 100644 index 00000000..ecf19f34 --- /dev/null +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observable.java @@ -0,0 +1,24 @@ +/** Generated by itemis CREATE code generator. */ +package com.yakindu.core.rx; + +import java.util.ArrayList; +import java.util.List; + +public class Observable { + + private List> observers = new ArrayList<>(); + + public void next(T value) { + for (Observer observer : observers) { + observer.next(value); + } + } + + public boolean subscribe(Observer observer) { + return observer != null ? this.observers.add(observer) : false; + } + + public boolean unsubscribe(Observer observer) { + return observer != null ? this.observers.remove(observer) : false; + } +} diff --git a/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observer.java b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observer.java new file mode 100644 index 00000000..d99f2f4e --- /dev/null +++ b/itemis.create.examples.trafficlight.java/src-gen/com/yakindu/core/rx/Observer.java @@ -0,0 +1,8 @@ +/** Generated by itemis CREATE code generator. */ +package com.yakindu.core.rx; + +public interface Observer { + + void next(T value); + +} diff --git a/itemis.create.examples.trafficlight.java/src-gen/traffic/light/TrafficLightCtrl.java b/itemis.create.examples.trafficlight.java/src-gen/traffic/light/TrafficLightCtrl.java new file mode 100644 index 00000000..cb283e86 --- /dev/null +++ b/itemis.create.examples.trafficlight.java/src-gen/traffic/light/TrafficLightCtrl.java @@ -0,0 +1,1455 @@ +/** Generated by itemis CREATE code generator. */ +package traffic.light; + +import com.yakindu.core.IEventDriven; +import com.yakindu.core.IStatemachine; +import com.yakindu.core.ITimed; +import com.yakindu.core.ITimerService; +import com.yakindu.core.rx.Observable; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +public class TrafficLightCtrl implements ITimed, IEventDriven { + public static class TrafficLight { + private TrafficLightCtrl parent; + + public TrafficLight(TrafficLightCtrl parent) { + this.parent = parent; + } + private boolean displayRed; + + + protected void raiseDisplayRed() { + synchronized(parent) { + displayRed = true; + displayRedObservable.next(null); + } + } + + private Observable displayRedObservable = new Observable(); + + public Observable getDisplayRed() { + return displayRedObservable; + } + + private boolean displayGreen; + + + protected void raiseDisplayGreen() { + synchronized(parent) { + displayGreen = true; + displayGreenObservable.next(null); + } + } + + private Observable displayGreenObservable = new Observable(); + + public Observable getDisplayGreen() { + return displayGreenObservable; + } + + private boolean displayYellow; + + + protected void raiseDisplayYellow() { + synchronized(parent) { + displayYellow = true; + displayYellowObservable.next(null); + } + } + + private Observable displayYellowObservable = new Observable(); + + public Observable getDisplayYellow() { + return displayYellowObservable; + } + + private boolean displayNone; + + + protected void raiseDisplayNone() { + synchronized(parent) { + displayNone = true; + displayNoneObservable.next(null); + } + } + + private Observable displayNoneObservable = new Observable(); + + public Observable getDisplayNone() { + return displayNoneObservable; + } + + } + + public static class Timer { + private TrafficLightCtrl parent; + + public Timer(TrafficLightCtrl parent) { + this.parent = parent; + } + private boolean updateTimerColour; + + private String updateTimerColourValue; + + + protected void raiseUpdateTimerColour(String value) { + synchronized(parent) { + updateTimerColourValue = value; + updateTimerColour = true; + updateTimerColourObservable.next(value); + } + } + + private Observable updateTimerColourObservable = new Observable(); + + public Observable getUpdateTimerColour() { + return updateTimerColourObservable; + } + + private boolean updateTimerValue; + + private long updateTimerValueValue; + + + protected void raiseUpdateTimerValue(long value) { + synchronized(parent) { + updateTimerValueValue = value; + updateTimerValue = true; + updateTimerValueObservable.next(value); + } + } + + private Observable updateTimerValueObservable = new Observable(); + + public Observable getUpdateTimerValue() { + return updateTimerValueObservable; + } + + public static final long oFF = -(1l); + + public synchronized long getOFF() { + synchronized(parent) { + return oFF; + } + } + + } + + protected TrafficLight trafficLight; + + protected Timer timer; + + public enum State { + MAIN_MAIN, + MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED, + MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK, + MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW, + MAIN_MAIN_TRAFFICLIGHT_NORMAL, + MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED, + MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW, + MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN, + MAIN_MAIN_TIMER_DISABLED, + MAIN_MAIN_TIMER_RUNNING, + MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN, + MAIN_MAIN_TIMER_RUNNING_RUNNING_RED, + MAIN_OFF, + $NULLSTATE$ + }; + + private State[] historyVector = new State[5]; + private final State[] stateVector = new State[2]; + + private ITimerService timerService; + + private final boolean[] timeEvents = new boolean[7]; + + private BlockingQueue internalEventQueue = new LinkedBlockingQueue(); + private BlockingQueue inEventQueue = new LinkedBlockingQueue(); + private boolean resetTimer; + private boolean disableTimer; + private boolean enableTimer; + private long counter; + + protected long getCounter() { + synchronized(TrafficLightCtrl.this) { + return counter; + } + } + + protected void setCounter(long value) { + synchronized(TrafficLightCtrl.this) { + this.counter = value; + } + } + + + private boolean isExecuting; + + protected boolean getIsExecuting() { + synchronized(TrafficLightCtrl.this) { + return isExecuting; + } + } + + protected void setIsExecuting(boolean value) { + synchronized(TrafficLightCtrl.this) { + this.isExecuting = value; + } + } + private long stateConfVectorPosition; + + protected long getStateConfVectorPosition() { + synchronized(TrafficLightCtrl.this) { + return stateConfVectorPosition; + } + } + + protected void setStateConfVectorPosition(long value) { + synchronized(TrafficLightCtrl.this) { + this.stateConfVectorPosition = value; + } + } + public TrafficLightCtrl() { + trafficLight = new TrafficLight(this); + timer = new Timer(this); + for (int i = 0; i < 2; i++) { + stateVector[i] = State.$NULLSTATE$; + } + for (int i = 0; i < 5; i++) { + historyVector[i] = State.$NULLSTATE$; + } + + clearInEvents(); + clearInternalEvents(); + + /* Default init sequence for statechart TrafficLightCtrl */ + setRedPeriod(12l); + setGreenPeriod(8l); + setYellowPeriod(3l); + setCounter(0l); + + isExecuting = false; + } + + public synchronized void enter() { + /* Activates the state machine. */ + if (timerService == null) { + throw new IllegalStateException("Timer service must be set."); + } + + if (getIsExecuting()) { + return; + } + isExecuting = true; + /* Default enter sequence for statechart TrafficLightCtrl */ + enterSequence_main_default(); + isExecuting = false; + } + + public synchronized void exit() { + /* Deactivates the state machine. */ + if (getIsExecuting()) { + return; + } + isExecuting = true; + /* Default exit sequence for statechart TrafficLightCtrl */ + exitSequence_main(); + isExecuting = false; + } + + /** + * @see IStatemachine#isActive() + */ + public synchronized boolean isActive() { + return stateVector[0] != State.$NULLSTATE$||stateVector[1] != State.$NULLSTATE$; + } + + /** + * Always returns 'false' since this state machine can never become final. + * + * @see IStatemachine#isFinal() + */ + public synchronized boolean isFinal() { + return false; + } + private void clearInEvents() { + police_interrupt = false; + toggle = false; + timeEvents[0] = false; + timeEvents[1] = false; + timeEvents[2] = false; + timeEvents[3] = false; + timeEvents[4] = false; + timeEvents[5] = false; + timeEvents[6] = false; + } + + private void clearInternalEvents() { + resetTimer = false; + disableTimer = false; + enableTimer = false; + } + + private void microStep() { + long transitioned = -1l; + stateConfVectorPosition = 0l; + switch (stateVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + transitioned = main_main_trafficlight_interrupted_blinking_Black_react(transitioned); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + transitioned = main_main_trafficlight_interrupted_blinking_Yellow_react(transitioned); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + transitioned = main_main_trafficlight_normal_normal_Red_react(transitioned); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + transitioned = main_main_trafficlight_normal_normal_Yellow_react(transitioned); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + transitioned = main_main_trafficlight_normal_normal_Green_react(transitioned); + break; + case MAIN_OFF: + transitioned = main_off_react(transitioned); + break; + default: + break; + } + if (getStateConfVectorPosition()<1l) { + switch (stateVector[1]) { + case MAIN_MAIN_TIMER_DISABLED: + main_main_timer_disabled_react(transitioned); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + main_main_timer_running_running_Green_react(transitioned); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + main_main_timer_running_running_Red_react(transitioned); + break; + default: + break; + } + } + } + + private void runCycle() { + /* Performs a 'run to completion' step. */ + if (timerService == null) { + throw new IllegalStateException("Timer service must be set."); + } + + if (getIsExecuting()) { + return; + } + isExecuting = true; + nextEvent(); + do { + microStep(); + clearInEvents(); + clearInternalEvents(); + } while (nextEvent()); + isExecuting = false; + } + + protected boolean nextEvent() { + if(!internalEventQueue.isEmpty()) { + internalEventQueue.poll().run(); + return true; + } + if(!inEventQueue.isEmpty()) { + inEventQueue.poll().run(); + return true; + } + return false; + } + /** + * Returns true if the given state is currently active otherwise false. + */ + public synchronized boolean isStateActive(State state) { + + switch (state) { + case MAIN_MAIN: + return stateVector[0].ordinal() >= State. + MAIN_MAIN.ordinal()&& stateVector[0].ordinal() <= State.MAIN_MAIN_TIMER_RUNNING_RUNNING_RED.ordinal(); + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED: + return stateVector[0].ordinal() >= State. + MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED.ordinal()&& stateVector[0].ordinal() <= State.MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW.ordinal(); + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + return stateVector[0] == State.MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + return stateVector[0] == State.MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL: + return stateVector[0].ordinal() >= State. + MAIN_MAIN_TRAFFICLIGHT_NORMAL.ordinal()&& stateVector[0].ordinal() <= State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN.ordinal(); + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + return stateVector[0] == State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + return stateVector[0] == State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + return stateVector[0] == State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN; + case MAIN_MAIN_TIMER_DISABLED: + return stateVector[1] == State.MAIN_MAIN_TIMER_DISABLED; + case MAIN_MAIN_TIMER_RUNNING: + return stateVector[1].ordinal() >= State. + MAIN_MAIN_TIMER_RUNNING.ordinal()&& stateVector[1].ordinal() <= State.MAIN_MAIN_TIMER_RUNNING_RUNNING_RED.ordinal(); + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + return stateVector[1] == State.MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + return stateVector[1] == State.MAIN_MAIN_TIMER_RUNNING_RUNNING_RED; + case MAIN_OFF: + return stateVector[0] == State.MAIN_OFF; + default: + return false; + } + } + + public synchronized void setTimerService(ITimerService timerService) { + this.timerService = timerService; + } + + public ITimerService getTimerService() { + return timerService; + } + + public synchronized void raiseTimeEvent(int eventID) { + inEventQueue.add(() -> { + timeEvents[eventID] = true; + }); + runCycle(); + } + + public TrafficLight trafficLight() { + return trafficLight; + } + + public Timer timer() { + return timer; + } + + + protected void raiseResetTimer() { + internalEventQueue.add(() -> { + resetTimer = true; + }); + } + + protected void raiseDisableTimer() { + internalEventQueue.add(() -> { + disableTimer = true; + }); + } + + protected void raiseEnableTimer() { + internalEventQueue.add(() -> { + enableTimer = true; + }); + } + + private boolean police_interrupt; + + + public void raisePolice_interrupt() { + synchronized(TrafficLightCtrl.this) { + inEventQueue.add(() -> { + police_interrupt = true; + }); + runCycle(); + } + } + + private boolean toggle; + + + public void raiseToggle() { + synchronized(TrafficLightCtrl.this) { + inEventQueue.add(() -> { + toggle = true; + }); + runCycle(); + } + } + + private long redPeriod; + + public synchronized long getRedPeriod() { + synchronized(TrafficLightCtrl.this) { + return redPeriod; + } + } + + public void setRedPeriod(long value) { + synchronized(TrafficLightCtrl.this) { + this.redPeriod = value; + } + } + + private long greenPeriod; + + public synchronized long getGreenPeriod() { + synchronized(TrafficLightCtrl.this) { + return greenPeriod; + } + } + + public void setGreenPeriod(long value) { + synchronized(TrafficLightCtrl.this) { + this.greenPeriod = value; + } + } + + private long yellowPeriod; + + public synchronized long getYellowPeriod() { + synchronized(TrafficLightCtrl.this) { + return yellowPeriod; + } + } + + public void setYellowPeriod(long value) { + synchronized(TrafficLightCtrl.this) { + this.yellowPeriod = value; + } + } + + /* Entry action for state 'Black'. */ + private void entryAction_main_main_trafficlight_interrupted_blinking_Black() { + /* Entry action for state 'Black'. */ + timerService.setTimer(this, 0, 500l, false); + trafficLight.raiseDisplayNone(); + } + + /* Entry action for state 'Yellow'. */ + private void entryAction_main_main_trafficlight_interrupted_blinking_Yellow() { + /* Entry action for state 'Yellow'. */ + timerService.setTimer(this, 1, 500l, false); + trafficLight.raiseDisplayYellow(); + } + + /* Entry action for state 'Red'. */ + private void entryAction_main_main_trafficlight_normal_normal_Red() { + /* Entry action for state 'Red'. */ + timerService.setTimer(this, 2, (getRedPeriod() * 1000l), false); + trafficLight.raiseDisplayRed(); + setCounter(redPeriod); + raiseResetTimer(); + } + + /* Entry action for state 'Yellow'. */ + private void entryAction_main_main_trafficlight_normal_normal_Yellow() { + /* Entry action for state 'Yellow'. */ + timerService.setTimer(this, 3, (getYellowPeriod() * 1000l), false); + trafficLight.raiseDisplayYellow(); + raiseDisableTimer(); + } + + /* Entry action for state 'Green'. */ + private void entryAction_main_main_trafficlight_normal_normal_Green() { + /* Entry action for state 'Green'. */ + timerService.setTimer(this, 4, (getGreenPeriod() * 1000l), false); + trafficLight.raiseDisplayGreen(); + setCounter(greenPeriod); + raiseResetTimer(); + } + + /* Entry action for state 'Green'. */ + private void entryAction_main_main_timer_running_running_Green() { + /* Entry action for state 'Green'. */ + timerService.setTimer(this, 5, (1l * 1000l), false); + timer.raiseUpdateTimerValue(getCounter()); + } + + /* Entry action for state 'Red'. */ + private void entryAction_main_main_timer_running_running_Red() { + /* Entry action for state 'Red'. */ + timerService.setTimer(this, 6, (1l * 1000l), false); + timer.raiseUpdateTimerValue(getCounter()); + } + + /* Exit action for state 'main'. */ + private void exitAction_main_main() { + /* Exit action for state 'main'. */ + trafficLight.raiseDisplayNone(); + } + + /* Exit action for state 'Black'. */ + private void exitAction_main_main_trafficlight_interrupted_blinking_Black() { + /* Exit action for state 'Black'. */ + timerService.unsetTimer(this, 0); + } + + /* Exit action for state 'Yellow'. */ + private void exitAction_main_main_trafficlight_interrupted_blinking_Yellow() { + /* Exit action for state 'Yellow'. */ + timerService.unsetTimer(this, 1); + } + + /* Exit action for state 'Red'. */ + private void exitAction_main_main_trafficlight_normal_normal_Red() { + /* Exit action for state 'Red'. */ + timerService.unsetTimer(this, 2); + } + + /* Exit action for state 'Yellow'. */ + private void exitAction_main_main_trafficlight_normal_normal_Yellow() { + /* Exit action for state 'Yellow'. */ + timerService.unsetTimer(this, 3); + } + + /* Exit action for state 'Green'. */ + private void exitAction_main_main_trafficlight_normal_normal_Green() { + /* Exit action for state 'Green'. */ + timerService.unsetTimer(this, 4); + } + + /* Exit action for state 'running'. */ + private void exitAction_main_main_timer_running() { + /* Exit action for state 'running'. */ + timer.raiseUpdateTimerValue(timer.getOFF()); + } + + /* Exit action for state 'Green'. */ + private void exitAction_main_main_timer_running_running_Green() { + /* Exit action for state 'Green'. */ + timerService.unsetTimer(this, 5); + } + + /* Exit action for state 'Red'. */ + private void exitAction_main_main_timer_running_running_Red() { + /* Exit action for state 'Red'. */ + timerService.unsetTimer(this, 6); + } + + /* 'default' enter sequence for state main */ + private void enterSequence_main_main_default() { + /* 'default' enter sequence for state main */ + enterSequence_main_main_trafficlight_default(); + enterSequence_main_main_timer_default(); + } + + /* 'default' enter sequence for state interrupted */ + private void enterSequence_main_main_trafficlight_interrupted_default() { + /* 'default' enter sequence for state interrupted */ + enterSequence_main_main_trafficlight_interrupted_blinking_default(); + historyVector[0] = stateVector[0]; + } + + /* 'default' enter sequence for state Black */ + private void enterSequence_main_main_trafficlight_interrupted_blinking_Black_default() { + /* 'default' enter sequence for state Black */ + entryAction_main_main_trafficlight_interrupted_blinking_Black(); + stateVector[0] = State.MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK; + stateConfVectorPosition = 0; + historyVector[1] = stateVector[0]; + } + + /* 'default' enter sequence for state Yellow */ + private void enterSequence_main_main_trafficlight_interrupted_blinking_Yellow_default() { + /* 'default' enter sequence for state Yellow */ + entryAction_main_main_trafficlight_interrupted_blinking_Yellow(); + stateVector[0] = State.MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW; + stateConfVectorPosition = 0; + historyVector[1] = stateVector[0]; + } + + /* 'default' enter sequence for state normal */ + private void enterSequence_main_main_trafficlight_normal_default() { + /* 'default' enter sequence for state normal */ + enterSequence_main_main_trafficlight_normal_normal_default(); + historyVector[0] = stateVector[0]; + } + + /* 'default' enter sequence for state Red */ + private void enterSequence_main_main_trafficlight_normal_normal_Red_default() { + /* 'default' enter sequence for state Red */ + entryAction_main_main_trafficlight_normal_normal_Red(); + stateVector[0] = State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED; + stateConfVectorPosition = 0; + historyVector[2] = stateVector[0]; + } + + /* 'default' enter sequence for state Yellow */ + private void enterSequence_main_main_trafficlight_normal_normal_Yellow_default() { + /* 'default' enter sequence for state Yellow */ + entryAction_main_main_trafficlight_normal_normal_Yellow(); + stateVector[0] = State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW; + stateConfVectorPosition = 0; + historyVector[2] = stateVector[0]; + } + + /* 'default' enter sequence for state Green */ + private void enterSequence_main_main_trafficlight_normal_normal_Green_default() { + /* 'default' enter sequence for state Green */ + entryAction_main_main_trafficlight_normal_normal_Green(); + stateVector[0] = State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN; + stateConfVectorPosition = 0; + historyVector[2] = stateVector[0]; + } + + /* 'default' enter sequence for state disabled */ + private void enterSequence_main_main_timer_disabled_default() { + /* 'default' enter sequence for state disabled */ + stateVector[1] = State.MAIN_MAIN_TIMER_DISABLED; + stateConfVectorPosition = 1; + historyVector[3] = stateVector[1]; + } + + /* 'default' enter sequence for state running */ + private void enterSequence_main_main_timer_running_default() { + /* 'default' enter sequence for state running */ + enterSequence_main_main_timer_running_running_default(); + historyVector[3] = stateVector[1]; + } + + /* 'default' enter sequence for state Green */ + private void enterSequence_main_main_timer_running_running_Green_default() { + /* 'default' enter sequence for state Green */ + entryAction_main_main_timer_running_running_Green(); + stateVector[1] = State.MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN; + stateConfVectorPosition = 1; + historyVector[4] = stateVector[1]; + } + + /* 'default' enter sequence for state Red */ + private void enterSequence_main_main_timer_running_running_Red_default() { + /* 'default' enter sequence for state Red */ + entryAction_main_main_timer_running_running_Red(); + stateVector[1] = State.MAIN_MAIN_TIMER_RUNNING_RUNNING_RED; + stateConfVectorPosition = 1; + historyVector[4] = stateVector[1]; + } + + /* 'default' enter sequence for state off */ + private void enterSequence_main_off_default() { + /* 'default' enter sequence for state off */ + stateVector[0] = State.MAIN_OFF; + stateConfVectorPosition = 0; + } + + /* 'default' enter sequence for region main */ + private void enterSequence_main_default() { + /* 'default' enter sequence for region main */ + react_main__entry_Default(); + } + + /* 'default' enter sequence for region trafficlight */ + private void enterSequence_main_main_trafficlight_default() { + /* 'default' enter sequence for region trafficlight */ + react_main_main_trafficlight__entry_Default(); + } + + /* deep enterSequence with history in child trafficlight */ + private void deepEnterSequence_main_main_trafficlight() { + /* deep enterSequence with history in child trafficlight */ + switch (historyVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + /* enterSequence with history in child interrupted for leaf Black */ + deepEnterSequence_main_main_trafficlight_interrupted_blinking(); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + /* enterSequence with history in child interrupted for leaf Yellow */ + deepEnterSequence_main_main_trafficlight_interrupted_blinking(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + /* enterSequence with history in child normal for leaf Red */ + deepEnterSequence_main_main_trafficlight_normal_normal(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + /* enterSequence with history in child normal for leaf Yellow */ + deepEnterSequence_main_main_trafficlight_normal_normal(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + /* enterSequence with history in child normal for leaf Green */ + deepEnterSequence_main_main_trafficlight_normal_normal(); + break; + default: + break; + } + } + + /* 'default' enter sequence for region blinking */ + private void enterSequence_main_main_trafficlight_interrupted_blinking_default() { + /* 'default' enter sequence for region blinking */ + react_main_main_trafficlight_interrupted_blinking__entry_Default(); + } + + /* deep enterSequence with history in child blinking */ + private void deepEnterSequence_main_main_trafficlight_interrupted_blinking() { + /* deep enterSequence with history in child blinking */ + switch (historyVector[1]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + /* enterSequence with history in child Black for leaf Black */ + enterSequence_main_main_trafficlight_interrupted_blinking_Black_default(); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + /* enterSequence with history in child Yellow for leaf Yellow */ + enterSequence_main_main_trafficlight_interrupted_blinking_Yellow_default(); + break; + default: + break; + } + } + + /* 'default' enter sequence for region normal */ + private void enterSequence_main_main_trafficlight_normal_normal_default() { + /* 'default' enter sequence for region normal */ + react_main_main_trafficlight_normal_normal__entry_Default(); + } + + /* deep enterSequence with history in child normal */ + private void deepEnterSequence_main_main_trafficlight_normal_normal() { + /* deep enterSequence with history in child normal */ + switch (historyVector[2]) { + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + /* enterSequence with history in child Red for leaf Red */ + enterSequence_main_main_trafficlight_normal_normal_Red_default(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + /* enterSequence with history in child Yellow for leaf Yellow */ + enterSequence_main_main_trafficlight_normal_normal_Yellow_default(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + /* enterSequence with history in child Green for leaf Green */ + enterSequence_main_main_trafficlight_normal_normal_Green_default(); + break; + default: + break; + } + } + + /* shallow enterSequence with history in child normal */ + private void shallowEnterSequence_main_main_trafficlight_normal_normal() { + /* shallow enterSequence with history in child normal */ + switch (historyVector[2]) { + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + enterSequence_main_main_trafficlight_normal_normal_Red_default(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + enterSequence_main_main_trafficlight_normal_normal_Yellow_default(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + enterSequence_main_main_trafficlight_normal_normal_Green_default(); + break; + default: + break; + } + } + + /* 'default' enter sequence for region timer */ + private void enterSequence_main_main_timer_default() { + /* 'default' enter sequence for region timer */ + react_main_main_timer__entry_Default(); + } + + /* deep enterSequence with history in child timer */ + private void deepEnterSequence_main_main_timer() { + /* deep enterSequence with history in child timer */ + switch (historyVector[3]) { + case MAIN_MAIN_TIMER_DISABLED: + /* enterSequence with history in child disabled for leaf disabled */ + enterSequence_main_main_timer_disabled_default(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + /* enterSequence with history in child running for leaf Green */ + deepEnterSequence_main_main_timer_running_running(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + /* enterSequence with history in child running for leaf Red */ + deepEnterSequence_main_main_timer_running_running(); + break; + default: + break; + } + } + + /* 'default' enter sequence for region running */ + private void enterSequence_main_main_timer_running_running_default() { + /* 'default' enter sequence for region running */ + react_main_main_timer_running_running__entry_Default(); + } + + /* deep enterSequence with history in child running */ + private void deepEnterSequence_main_main_timer_running_running() { + /* deep enterSequence with history in child running */ + switch (historyVector[4]) { + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + /* enterSequence with history in child Green for leaf Green */ + enterSequence_main_main_timer_running_running_Green_default(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + /* enterSequence with history in child Red for leaf Red */ + enterSequence_main_main_timer_running_running_Red_default(); + break; + default: + break; + } + } + + /* Default exit sequence for state main */ + private void exitSequence_main_main() { + /* Default exit sequence for state main */ + exitSequence_main_main_trafficlight(); + exitSequence_main_main_timer(); + exitAction_main_main(); + } + + /* Default exit sequence for state interrupted */ + private void exitSequence_main_main_trafficlight_interrupted() { + /* Default exit sequence for state interrupted */ + exitSequence_main_main_trafficlight_interrupted_blinking(); + } + + /* Default exit sequence for state Black */ + private void exitSequence_main_main_trafficlight_interrupted_blinking_Black() { + /* Default exit sequence for state Black */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + exitAction_main_main_trafficlight_interrupted_blinking_Black(); + } + + /* Default exit sequence for state Yellow */ + private void exitSequence_main_main_trafficlight_interrupted_blinking_Yellow() { + /* Default exit sequence for state Yellow */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + exitAction_main_main_trafficlight_interrupted_blinking_Yellow(); + } + + /* Default exit sequence for state normal */ + private void exitSequence_main_main_trafficlight_normal() { + /* Default exit sequence for state normal */ + exitSequence_main_main_trafficlight_normal_normal(); + } + + /* Default exit sequence for state Red */ + private void exitSequence_main_main_trafficlight_normal_normal_Red() { + /* Default exit sequence for state Red */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + exitAction_main_main_trafficlight_normal_normal_Red(); + } + + /* Default exit sequence for state Yellow */ + private void exitSequence_main_main_trafficlight_normal_normal_Yellow() { + /* Default exit sequence for state Yellow */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + exitAction_main_main_trafficlight_normal_normal_Yellow(); + } + + /* Default exit sequence for state Green */ + private void exitSequence_main_main_trafficlight_normal_normal_Green() { + /* Default exit sequence for state Green */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + exitAction_main_main_trafficlight_normal_normal_Green(); + } + + /* Default exit sequence for state disabled */ + private void exitSequence_main_main_timer_disabled() { + /* Default exit sequence for state disabled */ + stateVector[1] = State.$NULLSTATE$; + stateConfVectorPosition = 1; + } + + /* Default exit sequence for state running */ + private void exitSequence_main_main_timer_running() { + /* Default exit sequence for state running */ + exitSequence_main_main_timer_running_running(); + exitAction_main_main_timer_running(); + } + + /* Default exit sequence for state Green */ + private void exitSequence_main_main_timer_running_running_Green() { + /* Default exit sequence for state Green */ + stateVector[1] = State.$NULLSTATE$; + stateConfVectorPosition = 1; + exitAction_main_main_timer_running_running_Green(); + } + + /* Default exit sequence for state Red */ + private void exitSequence_main_main_timer_running_running_Red() { + /* Default exit sequence for state Red */ + stateVector[1] = State.$NULLSTATE$; + stateConfVectorPosition = 1; + exitAction_main_main_timer_running_running_Red(); + } + + /* Default exit sequence for state off */ + private void exitSequence_main_off() { + /* Default exit sequence for state off */ + stateVector[0] = State.$NULLSTATE$; + stateConfVectorPosition = 0; + } + + /* Default exit sequence for region main */ + private void exitSequence_main() { + /* Default exit sequence for region main */ + switch (stateVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + exitSequence_main_main_trafficlight_interrupted_blinking_Black(); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + exitSequence_main_main_trafficlight_interrupted_blinking_Yellow(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + exitSequence_main_main_trafficlight_normal_normal_Red(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + exitSequence_main_main_trafficlight_normal_normal_Yellow(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + exitSequence_main_main_trafficlight_normal_normal_Green(); + break; + case MAIN_OFF: + exitSequence_main_off(); + break; + default: + break; + } + switch (stateVector[1]) { + case MAIN_MAIN_TIMER_DISABLED: + exitSequence_main_main_timer_disabled(); + exitAction_main_main(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + exitSequence_main_main_timer_running_running_Green(); + exitAction_main_main_timer_running(); + exitAction_main_main(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + exitSequence_main_main_timer_running_running_Red(); + exitAction_main_main_timer_running(); + exitAction_main_main(); + break; + default: + break; + } + } + + /* Default exit sequence for region trafficlight */ + private void exitSequence_main_main_trafficlight() { + /* Default exit sequence for region trafficlight */ + switch (stateVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + exitSequence_main_main_trafficlight_interrupted_blinking_Black(); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + exitSequence_main_main_trafficlight_interrupted_blinking_Yellow(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + exitSequence_main_main_trafficlight_normal_normal_Red(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + exitSequence_main_main_trafficlight_normal_normal_Yellow(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + exitSequence_main_main_trafficlight_normal_normal_Green(); + break; + default: + break; + } + } + + /* Default exit sequence for region blinking */ + private void exitSequence_main_main_trafficlight_interrupted_blinking() { + /* Default exit sequence for region blinking */ + switch (stateVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_BLACK: + exitSequence_main_main_trafficlight_interrupted_blinking_Black(); + break; + case MAIN_MAIN_TRAFFICLIGHT_INTERRUPTED_BLINKING_YELLOW: + exitSequence_main_main_trafficlight_interrupted_blinking_Yellow(); + break; + default: + break; + } + } + + /* Default exit sequence for region normal */ + private void exitSequence_main_main_trafficlight_normal_normal() { + /* Default exit sequence for region normal */ + switch (stateVector[0]) { + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_RED: + exitSequence_main_main_trafficlight_normal_normal_Red(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_YELLOW: + exitSequence_main_main_trafficlight_normal_normal_Yellow(); + break; + case MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN: + exitSequence_main_main_trafficlight_normal_normal_Green(); + break; + default: + break; + } + } + + /* Default exit sequence for region timer */ + private void exitSequence_main_main_timer() { + /* Default exit sequence for region timer */ + switch (stateVector[1]) { + case MAIN_MAIN_TIMER_DISABLED: + exitSequence_main_main_timer_disabled(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + exitSequence_main_main_timer_running_running_Green(); + exitAction_main_main_timer_running(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + exitSequence_main_main_timer_running_running_Red(); + exitAction_main_main_timer_running(); + break; + default: + break; + } + } + + /* Default exit sequence for region running */ + private void exitSequence_main_main_timer_running_running() { + /* Default exit sequence for region running */ + switch (stateVector[1]) { + case MAIN_MAIN_TIMER_RUNNING_RUNNING_GREEN: + exitSequence_main_main_timer_running_running_Green(); + break; + case MAIN_MAIN_TIMER_RUNNING_RUNNING_RED: + exitSequence_main_main_timer_running_running_Red(); + break; + default: + break; + } + } + + /* The reactions of state null. */ + private void react_main_main_timer_running_running__choice_0() { + /* The reactions of state null. */ + if (isStateActive(State.MAIN_MAIN_TRAFFICLIGHT_NORMAL_NORMAL_GREEN)) { + timer.raiseUpdateTimerColour("Green"); + enterSequence_main_main_timer_running_running_Green_default(); + } else { + timer.raiseUpdateTimerColour("Red"); + enterSequence_main_main_timer_running_running_Red_default(); + } + } + + /* Default react sequence for initial entry */ + private void react_main_main_trafficlight_interrupted_blinking__entry_Default() { + /* Default react sequence for initial entry */ + enterSequence_main_main_trafficlight_interrupted_blinking_Yellow_default(); + } + + /* Default react sequence for initial entry */ + private void react_main_main_trafficlight_normal_normal__entry_Default() { + /* Default react sequence for initial entry */ + enterSequence_main_main_trafficlight_normal_normal_Red_default(); + } + + /* Default react sequence for shallow history entry hist */ + private void react_main_main_trafficlight_normal_normal_hist() { + /* Default react sequence for shallow history entry hist */ + /* Enter the region with shallow history */ + if (historyVector[2] != State.$NULLSTATE$) { + shallowEnterSequence_main_main_trafficlight_normal_normal(); + } else { + enterSequence_main_main_trafficlight_normal_normal_Red_default(); + } + } + + /* Default react sequence for deep history entry */ + private void react_main_main_trafficlight__entry_Default() { + /* Default react sequence for deep history entry */ + /* Enter the region with deep history */ + if (historyVector[0] != State.$NULLSTATE$) { + deepEnterSequence_main_main_trafficlight(); + } else { + enterSequence_main_main_trafficlight_normal_default(); + } + } + + /* Default react sequence for initial entry */ + private void react_main_main_timer_running_running__entry_Default() { + /* Default react sequence for initial entry */ + react_main_main_timer_running_running__choice_0(); + } + + /* Default react sequence for deep history entry */ + private void react_main_main_timer__entry_Default() { + /* Default react sequence for deep history entry */ + /* Enter the region with deep history */ + if (historyVector[3] != State.$NULLSTATE$) { + deepEnterSequence_main_main_timer(); + } else { + enterSequence_main_main_timer_running_default(); + } + } + + /* Default react sequence for initial entry */ + private void react_main__entry_Default() { + /* Default react sequence for initial entry */ + enterSequence_main_off_default(); + } + + private long react(long transitioned_before) { + /* State machine reactions. */ + return transitioned_before; + } + + private long main_main_react(long transitioned_before) { + /* The reactions of state main. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (toggle) { + exitSequence_main_main(); + enterSequence_main_off_default(); + react(0l); + transitioned_after = 1l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_trafficlight_interrupted_react(long transitioned_before) { + /* The reactions of state interrupted. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (police_interrupt) { + exitSequence_main_main_trafficlight_interrupted(); + raiseEnableTimer(); + react_main_main_trafficlight_normal_normal_hist(); + historyVector[0] = stateVector[0]; + transitioned_after = 0l; + } + } + return transitioned_after; + } + + private long main_main_trafficlight_interrupted_blinking_Black_react(long transitioned_before) { + /* The reactions of state Black. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (timeEvents[0]) { + exitSequence_main_main_trafficlight_interrupted_blinking_Black(); + timeEvents[0] = false; + enterSequence_main_main_trafficlight_interrupted_blinking_Yellow_default(); + main_main_trafficlight_interrupted_react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_trafficlight_interrupted_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_trafficlight_interrupted_blinking_Yellow_react(long transitioned_before) { + /* The reactions of state Yellow. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (timeEvents[1]) { + exitSequence_main_main_trafficlight_interrupted_blinking_Yellow(); + timeEvents[1] = false; + enterSequence_main_main_trafficlight_interrupted_blinking_Black_default(); + main_main_trafficlight_interrupted_react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_trafficlight_interrupted_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_trafficlight_normal_react(long transitioned_before) { + /* The reactions of state normal. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (police_interrupt) { + exitSequence_main_main_trafficlight_normal(); + raiseDisableTimer(); + enterSequence_main_main_trafficlight_interrupted_default(); + transitioned_after = 0l; + } + } + return transitioned_after; + } + + private long main_main_trafficlight_normal_normal_Red_react(long transitioned_before) { + /* The reactions of state Red. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (timeEvents[2]) { + exitSequence_main_main_trafficlight_normal_normal_Red(); + timeEvents[2] = false; + enterSequence_main_main_trafficlight_normal_normal_Green_default(); + main_main_trafficlight_normal_react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_trafficlight_normal_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_trafficlight_normal_normal_Yellow_react(long transitioned_before) { + /* The reactions of state Yellow. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (timeEvents[3]) { + exitSequence_main_main_trafficlight_normal_normal_Yellow(); + raiseEnableTimer(); + timeEvents[3] = false; + enterSequence_main_main_trafficlight_normal_normal_Red_default(); + main_main_trafficlight_normal_react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_trafficlight_normal_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_trafficlight_normal_normal_Green_react(long transitioned_before) { + /* The reactions of state Green. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (timeEvents[4]) { + exitSequence_main_main_trafficlight_normal_normal_Green(); + timeEvents[4] = false; + enterSequence_main_main_trafficlight_normal_normal_Yellow_default(); + main_main_trafficlight_normal_react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_trafficlight_normal_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_timer_disabled_react(long transitioned_before) { + /* The reactions of state disabled. */ + long transitioned_after = transitioned_before; + if (transitioned_after<1l) { + if (enableTimer) { + exitSequence_main_main_timer_disabled(); + enterSequence_main_main_timer_running_default(); + main_main_react(0l); + transitioned_after = 1l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_timer_running_react(long transitioned_before) { + /* The reactions of state running. */ + long transitioned_after = transitioned_before; + if (transitioned_after<1l) { + if (disableTimer) { + exitSequence_main_main_timer_running(); + enterSequence_main_main_timer_disabled_default(); + main_main_react(0l); + transitioned_after = 1l; + } else { + if (resetTimer) { + exitSequence_main_main_timer_running(); + enterSequence_main_main_timer_running_default(); + main_main_react(0l); + transitioned_after = 1l; + } + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_timer_running_running_Green_react(long transitioned_before) { + /* The reactions of state Green. */ + long transitioned_after = transitioned_before; + if (transitioned_after<1l) { + if (timeEvents[5]) { + exitSequence_main_main_timer_running_running_Green(); + setCounter(getCounter() - 1l); + timeEvents[5] = false; + enterSequence_main_main_timer_running_running_Green_default(); + main_main_timer_running_react(1l); + transitioned_after = 1l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_timer_running_react(transitioned_before); + } + return transitioned_after; + } + + private long main_main_timer_running_running_Red_react(long transitioned_before) { + /* The reactions of state Red. */ + long transitioned_after = transitioned_before; + if (transitioned_after<1l) { + if (timeEvents[6]) { + exitSequence_main_main_timer_running_running_Red(); + setCounter(getCounter() - 1l); + timeEvents[6] = false; + enterSequence_main_main_timer_running_running_Red_default(); + main_main_timer_running_react(1l); + transitioned_after = 1l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = main_main_timer_running_react(transitioned_before); + } + return transitioned_after; + } + + private long main_off_react(long transitioned_before) { + /* The reactions of state off. */ + long transitioned_after = transitioned_before; + if (transitioned_after<0l) { + if (toggle) { + exitSequence_main_off(); + enterSequence_main_main_default(); + react(0l); + transitioned_after = 0l; + } + } + /* If no transition was taken */ + if (transitioned_after==transitioned_before) { + /* then execute local reactions. */ + transitioned_after = react(transitioned_before); + } + return transitioned_after; + } + + /* Can be used by the client code to trigger a run to completion step without raising an event. */ + public synchronized void triggerWithoutEvent() { + runCycle(); + } +} diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/TrafficlightDemo.java b/itemis.create.examples.trafficlight.java/src/traffic/light/TrafficlightDemo.java similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/TrafficlightDemo.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/TrafficlightDemo.java diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java similarity index 89% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java index 494f655a..0a770d35 100644 --- a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java +++ b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/ButtonPanel.java @@ -1,11 +1,11 @@ /** - * Copyright (c) 2016 committers of YAKINDU and others. + * Copyright (c) 2016 committers of CREATE and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: - * committers of YAKINDU - initial API and implementation + * committers of CREATE - initial API and implementation * */ package traffic.light.ui; diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/Counter.java b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/Counter.java similarity index 97% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/Counter.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/ui/Counter.java index 8c1bedd7..444683c9 100644 --- a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/Counter.java +++ b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/Counter.java @@ -1,11 +1,11 @@ /** - * Copyright (c) 2016 committers of YAKINDU and others. + * Copyright (c) 2016 committers of CREATE and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: - * committers of YAKINDU - initial API and implementation + * committers of CREATE - initial API and implementation * */ package traffic.light.ui; diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/CrossWalkPanel.java b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/CrossWalkPanel.java similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/CrossWalkPanel.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/ui/CrossWalkPanel.java diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java similarity index 94% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java index 305b85cd..ef515eeb 100644 --- a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java +++ b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/TrafficLight.java @@ -1,11 +1,11 @@ /** - * Copyright (c) 2016 committers of YAKINDU and others. + * Copyright (c) 2016 committers of CREATE and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: - * committers of YAKINDU - initial API and implementation + * committers of CREATE - initial API and implementation * */ package traffic.light.ui; diff --git a/org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/TrafficLightFrame.java b/itemis.create.examples.trafficlight.java/src/traffic/light/ui/TrafficLightFrame.java similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/src/traffic/light/ui/TrafficLightFrame.java rename to itemis.create.examples.trafficlight.java/src/traffic/light/ui/TrafficLightFrame.java diff --git a/org.yakindu.sct.examples.basic.eventbuffers/.project b/itemis.create.examples.trafficlight.multism/.project similarity index 86% rename from org.yakindu.sct.examples.basic.eventbuffers/.project rename to itemis.create.examples.trafficlight.multism/.project index 71f92997..30d86e03 100644 --- a/org.yakindu.sct.examples.basic.eventbuffers/.project +++ b/itemis.create.examples.trafficlight.multism/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.basic.eventbuffers + itemis.create.examples.trafficlight.multism diff --git a/org.yakindu.sct.examples.trafficlight.cpp.arduino/css/style.css b/itemis.create.examples.trafficlight.multism/css/style.css similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.arduino/css/style.css rename to itemis.create.examples.trafficlight.multism/css/style.css diff --git a/com.yakindu.sct.examples.trafficlight.multism/images/multi_state_machine_example_overview.png b/itemis.create.examples.trafficlight.multism/images/multi_state_machine_example_overview.png similarity index 100% rename from com.yakindu.sct.examples.trafficlight.multism/images/multi_state_machine_example_overview.png rename to itemis.create.examples.trafficlight.multism/images/multi_state_machine_example_overview.png diff --git a/org.yakindu.sct.examples.trafficlight.java/images/traffic_light_thumb.jpg b/itemis.create.examples.trafficlight.multism/images/traffic_light_thumb.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/images/traffic_light_thumb.jpg rename to itemis.create.examples.trafficlight.multism/images/traffic_light_thumb.jpg diff --git a/com.yakindu.sct.examples.trafficlight.multism/index.html b/itemis.create.examples.trafficlight.multism/index.html similarity index 100% rename from com.yakindu.sct.examples.trafficlight.multism/index.html rename to itemis.create.examples.trafficlight.multism/index.html diff --git a/com.yakindu.sct.examples.trafficlight.multism/metadata.json b/itemis.create.examples.trafficlight.multism/metadata.json similarity index 85% rename from com.yakindu.sct.examples.trafficlight.multism/metadata.json rename to itemis.create.examples.trafficlight.multism/metadata.json index 2f72b95e..4ca5a682 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/metadata.json +++ b/itemis.create.examples.trafficlight.multism/metadata.json @@ -1,5 +1,5 @@ { - "id": "com.yakindu.sct.examples.trafficlight.multism", + "id": "itemis.create.examples.trafficlight.multism", "title": "Traffic Light with Multi State Machines", "description": "This example of the traffic light control demonstrates how to model multiple state machines that communicate with each other.", "previewImage": "traffic_light_thumb.jpg", diff --git a/com.yakindu.sct.examples.trafficlight.multism/model/ReleaseProcess.ysc b/itemis.create.examples.trafficlight.multism/model/ReleaseProcess.ysc similarity index 98% rename from com.yakindu.sct.examples.trafficlight.multism/model/ReleaseProcess.ysc rename to itemis.create.examples.trafficlight.multism/model/ReleaseProcess.ysc index 24236e08..61c316b4 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/model/ReleaseProcess.ysc +++ b/itemis.create.examples.trafficlight.multism/model/ReleaseProcess.ysc @@ -17,7 +17,7 @@ - + diff --git a/com.yakindu.sct.examples.trafficlight.multism/model/StreetCrossingSystem.ysc b/itemis.create.examples.trafficlight.multism/model/StreetCrossingSystem.ysc similarity index 99% rename from com.yakindu.sct.examples.trafficlight.multism/model/StreetCrossingSystem.ysc rename to itemis.create.examples.trafficlight.multism/model/StreetCrossingSystem.ysc index b3919df3..78b95bb8 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/model/StreetCrossingSystem.ysc +++ b/itemis.create.examples.trafficlight.multism/model/StreetCrossingSystem.ysc @@ -20,7 +20,7 @@ - + diff --git a/com.yakindu.sct.examples.trafficlight.multism/model/TrafficLight.ysc b/itemis.create.examples.trafficlight.multism/model/TrafficLight.ysc similarity index 99% rename from com.yakindu.sct.examples.trafficlight.multism/model/TrafficLight.ysc rename to itemis.create.examples.trafficlight.multism/model/TrafficLight.ysc index b106c5f4..1a8b1e7b 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/model/TrafficLight.ysc +++ b/itemis.create.examples.trafficlight.multism/model/TrafficLight.ysc @@ -31,7 +31,7 @@ - + diff --git a/com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc b/itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc similarity index 99% rename from com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc rename to itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc index 14fa51a7..d6dd17ac 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc +++ b/itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl.ysc @@ -40,7 +40,7 @@ - + diff --git a/com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc b/itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc similarity index 99% rename from com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc rename to itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc index b544fe1f..5755cbb0 100644 --- a/com.yakindu.sct.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc +++ b/itemis.create.examples.trafficlight.multism/model/TwoWayTrafficControl2.ysc @@ -28,7 +28,7 @@ - + diff --git a/com.yakindu.sct.examples.trafficlight.multism/tests/TwoWayTrafficControl.sctunit b/itemis.create.examples.trafficlight.multism/tests/TwoWayTrafficControl.sctunit similarity index 100% rename from com.yakindu.sct.examples.trafficlight.multism/tests/TwoWayTrafficControl.sctunit rename to itemis.create.examples.trafficlight.multism/tests/TwoWayTrafficControl.sctunit diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/.gitignore b/itemis.create.examples.trafficlight.python.raspberry/.gitignore similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/.gitignore rename to itemis.create.examples.trafficlight.python.raspberry/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/.project b/itemis.create.examples.trafficlight.python.raspberry/.project similarity index 90% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/.project rename to itemis.create.examples.trafficlight.python.raspberry/.project index c73443be..cc184c97 100644 --- a/org.yakindu.sct.examples.trafficlight.python.raspberry/.project +++ b/itemis.create.examples.trafficlight.python.raspberry/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.python.raspberry + itemis.create.examples.trafficlight.python.raspberry diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/.pydevproject b/itemis.create.examples.trafficlight.python.raspberry/.pydevproject similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/.pydevproject rename to itemis.create.examples.trafficlight.python.raspberry/.pydevproject diff --git a/org.yakindu.sct.examples.trafficlight.cpp.qt/css/style.css b/itemis.create.examples.trafficlight.python.raspberry/css/style.css similarity index 100% rename from org.yakindu.sct.examples.trafficlight.cpp.qt/css/style.css rename to itemis.create.examples.trafficlight.python.raspberry/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/images/TrafficLightCtrl.png b/itemis.create.examples.trafficlight.python.raspberry/images/TrafficLightCtrl.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/images/TrafficLightCtrl.png rename to itemis.create.examples.trafficlight.python.raspberry/images/TrafficLightCtrl.png diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/images/rpi_circuit.svg b/itemis.create.examples.trafficlight.python.raspberry/images/rpi_circuit.svg similarity index 99% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/images/rpi_circuit.svg rename to itemis.create.examples.trafficlight.python.raspberry/images/rpi_circuit.svg index 2a38814c..8676410b 100644 --- a/org.yakindu.sct.examples.trafficlight.python.raspberry/images/rpi_circuit.svg +++ b/itemis.create.examples.trafficlight.python.raspberry/images/rpi_circuit.svg @@ -5669,7 +5669,7 @@ - + @@ -5678,8 +5678,8 @@ - - + + diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/images/traffic_light_python_rasp.jpg b/itemis.create.examples.trafficlight.python.raspberry/images/traffic_light_python_rasp.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/images/traffic_light_python_rasp.jpg rename to itemis.create.examples.trafficlight.python.raspberry/images/traffic_light_python_rasp.jpg diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/index.html b/itemis.create.examples.trafficlight.python.raspberry/index.html similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/index.html rename to itemis.create.examples.trafficlight.python.raspberry/index.html diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/metadata.json b/itemis.create.examples.trafficlight.python.raspberry/metadata.json similarity index 76% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/metadata.json rename to itemis.create.examples.trafficlight.python.raspberry/metadata.json index 04d7251c..05acacef 100644 --- a/org.yakindu.sct.examples.trafficlight.python.raspberry/metadata.json +++ b/itemis.create.examples.trafficlight.python.raspberry/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.trafficlight.python.raspberry", + "id": "itemis.create.examples.trafficlight.python.raspberry", "title": "Raspberry Pi - Traffic Light (Python)", "description": "Demonstrates how to generate Python source code from a statechart.", "previewImage": "traffic_light_python_rasp.jpg", @@ -13,7 +13,7 @@ "dependencies": [ { "updateSite": "http://updates.yakindu.com/statecharts/labs", - "features": ["org.yakindu.sct.generator.python.feature.feature.group"] + "features": ["itemis.create.generator.python.feature.feature.group"] } ] } diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen b/itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen similarity index 70% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen rename to itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen index eb016892..dd399e4e 100644 --- a/org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen +++ b/itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::python { statechart TrafficLightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.python.raspberry" + targetProject = "itemis.create.examples.trafficlight.python.raspberry" targetFolder = "src" } diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc b/itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc rename to itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc index 00e44a08..d06de5c5 100644 --- a/org.yakindu.sct.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc +++ b/itemis.create.examples.trafficlight.python.raspberry/model/TrafficLightCtrl.ysc @@ -64,7 +64,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/src/main.py b/itemis.create.examples.trafficlight.python.raspberry/src/main.py similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/src/main.py rename to itemis.create.examples.trafficlight.python.raspberry/src/main.py diff --git a/itemis.create.examples.trafficlight.python.raspberry/src/traffic_light_ctrl.py b/itemis.create.examples.trafficlight.python.raspberry/src/traffic_light_ctrl.py new file mode 100644 index 00000000..ef5d8b39 --- /dev/null +++ b/itemis.create.examples.trafficlight.python.raspberry/src/traffic_light_ctrl.py @@ -0,0 +1,1099 @@ +"""Implementation of statechart traffic_light_ctrl. +Generated by itemis CREATE code generator. +""" + + +class TrafficLightCtrl: + """Implementation of the state machine TrafficLightCtrl. + """ + + class State: + """ State Enum + """ + ( + main_region_on, + main_region_on_r1street_green, + main_region_on_r1ped_waiting, + main_region_on_r1ped_waiting_r1wait_on, + main_region_on_r1ped_waiting_r1wait_off, + main_region_on_r1street_attention, + main_region_on_r1street_red, + main_region_on_r1pedestrian_green, + main_region_on_r1pedestrian_red, + main_region_on_r1street_prepare, + main_region_on_r1safe, + main_region_off, + main_region_off_r1yellow_on, + main_region_off_r1yellow_off, + null_state + ) = range(15) + + + class EvBuf: + """Implementation of internal scope. + """ + + def __init__(self): + self.pedestrian_request = False + self.on_off = False + + class TimeEventsEvBuf: + """Implementation of internal scope. + """ + + def __init__(self): + self.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = False + self.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = False + self.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = False + self.traffic_light_ctrl_time_event_0 = False + + class TrafficLightCtrlEvBuf: + """Implementation of internal scope. + """ + + def __init__(self, iface, time_events): + self.iface = iface + self.time_events = time_events + + class TrafficLight: + """Implementation of scope TrafficLight. + """ + + def __init__(self, statemachine): + self.red = None + self.yellow = None + self.green = None + + self.statemachine = statemachine + + + class Pedestrian: + """Implementation of scope Pedestrian. + """ + + def __init__(self, statemachine): + self.request = None + self.red = None + self.green = None + + self.statemachine = statemachine + + + def __init__(self): + """ Declares all necessary variables including list of states, histories etc. + """ + self.traffic_light = TrafficLightCtrl.TrafficLight(self) + self.pedestrian = TrafficLightCtrl.Pedestrian(self) + + self.pedestrian_request = None + self.on_off = None + self.operation_callback = None + + + # enumeration of all states: + self.__State = TrafficLightCtrl.State + self.__state_conf_vector_changed = None + self.__state_vector = [None] * 1 + for __state_index in range(1): + self.__state_vector[__state_index] = self.State.null_state + + # for timed statechart: + self.timer_service = None + self.__time_events = [None] * 12 + + # initializations: + #Default init sequence for statechart TrafficLightCtrl + self.traffic_light.red = False + self.traffic_light.yellow = False + self.traffic_light.green = False + self.pedestrian.request = False + self.pedestrian.red = False + self.pedestrian.green = False + self.__current = self.TrafficLightCtrlEvBuf( + self.EvBuf(), + self.TimeEventsEvBuf() + ) + self.__is_executing = False + + def is_active(self): + """Checks if the state machine is active. + """ + return self.__state_vector[0] is not self.__State.null_state + + def is_final(self): + """Checks if the statemachine is final. + Always returns 'false' since this state machine can never become final. + """ + return False + + def is_state_active(self, state): + """Checks if the state is currently active. + """ + s = state + if s == self.__State.main_region_on: + return (self.__state_vector[0] >= self.__State.main_region_on)\ + and (self.__state_vector[0] <= self.__State.main_region_on_r1safe) + if s == self.__State.main_region_on_r1street_green: + return self.__state_vector[0] == self.__State.main_region_on_r1street_green + if s == self.__State.main_region_on_r1ped_waiting: + return (self.__state_vector[0] >= self.__State.main_region_on_r1ped_waiting)\ + and (self.__state_vector[0] <= self.__State.main_region_on_r1ped_waiting_r1wait_off) + if s == self.__State.main_region_on_r1ped_waiting_r1wait_on: + return self.__state_vector[0] == self.__State.main_region_on_r1ped_waiting_r1wait_on + if s == self.__State.main_region_on_r1ped_waiting_r1wait_off: + return self.__state_vector[0] == self.__State.main_region_on_r1ped_waiting_r1wait_off + if s == self.__State.main_region_on_r1street_attention: + return self.__state_vector[0] == self.__State.main_region_on_r1street_attention + if s == self.__State.main_region_on_r1street_red: + return self.__state_vector[0] == self.__State.main_region_on_r1street_red + if s == self.__State.main_region_on_r1pedestrian_green: + return self.__state_vector[0] == self.__State.main_region_on_r1pedestrian_green + if s == self.__State.main_region_on_r1pedestrian_red: + return self.__state_vector[0] == self.__State.main_region_on_r1pedestrian_red + if s == self.__State.main_region_on_r1street_prepare: + return self.__state_vector[0] == self.__State.main_region_on_r1street_prepare + if s == self.__State.main_region_on_r1safe: + return self.__state_vector[0] == self.__State.main_region_on_r1safe + if s == self.__State.main_region_off: + return (self.__state_vector[0] >= self.__State.main_region_off)\ + and (self.__state_vector[0] <= self.__State.main_region_off_r1yellow_off) + if s == self.__State.main_region_off_r1yellow_on: + return self.__state_vector[0] == self.__State.main_region_off_r1yellow_on + if s == self.__State.main_region_off_r1yellow_off: + return self.__state_vector[0] == self.__State.main_region_off_r1yellow_off + return False + + def time_elapsed(self, event_id): + """ Mark the corresponding time event as True. + """ + if event_id in range(12): + self.__time_events[event_id] = True + + def raise_pedestrian_request(self): + """Raise method for event pedestrian_request. + """ + self.pedestrian_request = True + + def raise_on_off(self): + """Raise method for event on_off. + """ + self.on_off = True + + def __entry_action_main_region_on_r1_street_green(self): + """Entry action for state 'StreetGreen'.. + """ + #Entry action for state 'StreetGreen'. + self.traffic_light.red = False + self.traffic_light.yellow = False + self.traffic_light.green = True + self.pedestrian.red = True + self.pedestrian.green = False + self.pedestrian.request = False + + def __entry_action_main_region_on_r1_ped_waiting(self): + """Entry action for state 'PedWaiting'.. + """ + #Entry action for state 'PedWaiting'. + self.timer_service.set_timer(self, 0, (7 * 1000), False) + + def __entry_action_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Entry action for state 'waitOn'.. + """ + #Entry action for state 'waitOn'. + self.timer_service.set_timer(self, 1, 500, False) + self.pedestrian.request = True + + def __entry_action_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Entry action for state 'waitOff'.. + """ + #Entry action for state 'waitOff'. + self.timer_service.set_timer(self, 2, 500, False) + self.pedestrian.request = False + + def __entry_action_main_region_on_r1_street_attention(self): + """Entry action for state 'StreetAttention'.. + """ + #Entry action for state 'StreetAttention'. + self.timer_service.set_timer(self, 3, (2 * 1000), False) + self.traffic_light.red = False + self.traffic_light.yellow = True + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_street_red(self): + """Entry action for state 'StreetRed'.. + """ + #Entry action for state 'StreetRed'. + self.timer_service.set_timer(self, 4, (2 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = False + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_pedestrian_green(self): + """Entry action for state 'PedestrianGreen'.. + """ + #Entry action for state 'PedestrianGreen'. + self.timer_service.set_timer(self, 5, (7 * 1000), False) + self.pedestrian.red = False + self.pedestrian.green = True + + def __entry_action_main_region_on_r1_pedestrian_red(self): + """Entry action for state 'PedestrianRed'.. + """ + #Entry action for state 'PedestrianRed'. + self.timer_service.set_timer(self, 6, (5 * 1000), False) + self.pedestrian.red = True + self.pedestrian.green = False + + def __entry_action_main_region_on_r1_street_prepare(self): + """Entry action for state 'StreetPrepare'.. + """ + #Entry action for state 'StreetPrepare'. + self.timer_service.set_timer(self, 7, (2 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = True + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_safe(self): + """Entry action for state 'Safe'.. + """ + #Entry action for state 'Safe'. + self.timer_service.set_timer(self, 8, (10 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = False + self.traffic_light.green = False + self.pedestrian.red = True + self.pedestrian.green = False + self.pedestrian.request = False + + def __entry_action_main_region_off(self): + """Entry action for state 'off'.. + """ + #Entry action for state 'off'. + self.traffic_light.red = False + self.traffic_light.green = False + self.traffic_light.yellow = False + self.pedestrian.red = False + self.pedestrian.green = False + + def __entry_action_main_region_off_r1_yellow_on(self): + """Entry action for state 'YellowOn'.. + """ + #Entry action for state 'YellowOn'. + self.timer_service.set_timer(self, 9, 500, False) + self.traffic_light.yellow = True + self.pedestrian.request = True + + def __entry_action_main_region_off_r1_yellow_off(self): + """Entry action for state 'YellowOff'.. + """ + #Entry action for state 'YellowOff'. + self.timer_service.set_timer(self, 10, 500, False) + self.traffic_light.yellow = False + self.pedestrian.request = False + + def __exit_action_main_region_on_r1_ped_waiting(self): + """Exit action for state 'PedWaiting'.. + """ + #Exit action for state 'PedWaiting'. + self.timer_service.unset_timer(self, 0) + self.pedestrian.request = False + + def __exit_action_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Exit action for state 'waitOn'.. + """ + #Exit action for state 'waitOn'. + self.timer_service.unset_timer(self, 1) + + def __exit_action_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Exit action for state 'waitOff'.. + """ + #Exit action for state 'waitOff'. + self.timer_service.unset_timer(self, 2) + + def __exit_action_main_region_on_r1_street_attention(self): + """Exit action for state 'StreetAttention'.. + """ + #Exit action for state 'StreetAttention'. + self.timer_service.unset_timer(self, 3) + + def __exit_action_main_region_on_r1_street_red(self): + """Exit action for state 'StreetRed'.. + """ + #Exit action for state 'StreetRed'. + self.timer_service.unset_timer(self, 4) + + def __exit_action_main_region_on_r1_pedestrian_green(self): + """Exit action for state 'PedestrianGreen'.. + """ + #Exit action for state 'PedestrianGreen'. + self.timer_service.unset_timer(self, 5) + + def __exit_action_main_region_on_r1_pedestrian_red(self): + """Exit action for state 'PedestrianRed'.. + """ + #Exit action for state 'PedestrianRed'. + self.timer_service.unset_timer(self, 6) + + def __exit_action_main_region_on_r1_street_prepare(self): + """Exit action for state 'StreetPrepare'.. + """ + #Exit action for state 'StreetPrepare'. + self.timer_service.unset_timer(self, 7) + + def __exit_action_main_region_on_r1_safe(self): + """Exit action for state 'Safe'.. + """ + #Exit action for state 'Safe'. + self.timer_service.unset_timer(self, 8) + + def __exit_action_main_region_off_r1_yellow_on(self): + """Exit action for state 'YellowOn'.. + """ + #Exit action for state 'YellowOn'. + self.timer_service.unset_timer(self, 9) + + def __exit_action_main_region_off_r1_yellow_off(self): + """Exit action for state 'YellowOff'.. + """ + #Exit action for state 'YellowOff'. + self.timer_service.unset_timer(self, 10) + + def __enter_sequence_main_region_on_default(self): + """'default' enter sequence for state on. + """ + #'default' enter sequence for state on + self.__enter_sequence_main_region_on_r1_default() + + def __enter_sequence_main_region_on_r1_street_green_default(self): + """'default' enter sequence for state StreetGreen. + """ + #'default' enter sequence for state StreetGreen + self.__entry_action_main_region_on_r1_street_green() + self.__state_vector[0] = self.State.main_region_on_r1street_green + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_ped_waiting_default(self): + """'default' enter sequence for state PedWaiting. + """ + #'default' enter sequence for state PedWaiting + self.__entry_action_main_region_on_r1_ped_waiting() + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_default() + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default(self): + """'default' enter sequence for state waitOn. + """ + #'default' enter sequence for state waitOn + self.__entry_action_main_region_on_r1_ped_waiting_r1_wait_on() + self.__state_vector[0] = self.State.main_region_on_r1ped_waiting_r1wait_on + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_wait_off_default(self): + """'default' enter sequence for state waitOff. + """ + #'default' enter sequence for state waitOff + self.__entry_action_main_region_on_r1_ped_waiting_r1_wait_off() + self.__state_vector[0] = self.State.main_region_on_r1ped_waiting_r1wait_off + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_attention_default(self): + """'default' enter sequence for state StreetAttention. + """ + #'default' enter sequence for state StreetAttention + self.__entry_action_main_region_on_r1_street_attention() + self.__state_vector[0] = self.State.main_region_on_r1street_attention + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_red_default(self): + """'default' enter sequence for state StreetRed. + """ + #'default' enter sequence for state StreetRed + self.__entry_action_main_region_on_r1_street_red() + self.__state_vector[0] = self.State.main_region_on_r1street_red + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_pedestrian_green_default(self): + """'default' enter sequence for state PedestrianGreen. + """ + #'default' enter sequence for state PedestrianGreen + self.__entry_action_main_region_on_r1_pedestrian_green() + self.__state_vector[0] = self.State.main_region_on_r1pedestrian_green + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_pedestrian_red_default(self): + """'default' enter sequence for state PedestrianRed. + """ + #'default' enter sequence for state PedestrianRed + self.__entry_action_main_region_on_r1_pedestrian_red() + self.__state_vector[0] = self.State.main_region_on_r1pedestrian_red + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_prepare_default(self): + """'default' enter sequence for state StreetPrepare. + """ + #'default' enter sequence for state StreetPrepare + self.__entry_action_main_region_on_r1_street_prepare() + self.__state_vector[0] = self.State.main_region_on_r1street_prepare + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_safe_default(self): + """'default' enter sequence for state Safe. + """ + #'default' enter sequence for state Safe + self.__entry_action_main_region_on_r1_safe() + self.__state_vector[0] = self.State.main_region_on_r1safe + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_off_default(self): + """'default' enter sequence for state off. + """ + #'default' enter sequence for state off + self.__entry_action_main_region_off() + self.__enter_sequence_main_region_off_r1_default() + + def __enter_sequence_main_region_off_r1_yellow_on_default(self): + """'default' enter sequence for state YellowOn. + """ + #'default' enter sequence for state YellowOn + self.__entry_action_main_region_off_r1_yellow_on() + self.__state_vector[0] = self.State.main_region_off_r1yellow_on + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_off_r1_yellow_off_default(self): + """'default' enter sequence for state YellowOff. + """ + #'default' enter sequence for state YellowOff + self.__entry_action_main_region_off_r1_yellow_off() + self.__state_vector[0] = self.State.main_region_off_r1yellow_off + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_default(self): + """'default' enter sequence for region main region. + """ + #'default' enter sequence for region main region + self.__react_main_region__entry_default() + + def __enter_sequence_main_region_on_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_on_r1__entry_default() + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_on_r1_ped_waiting_r1__entry_default() + + def __enter_sequence_main_region_off_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_off_r1__entry_default() + + def __exit_sequence_main_region_on(self): + """Default exit sequence for state on. + """ + #Default exit sequence for state on + self.__exit_sequence_main_region_on_r1() + + def __exit_sequence_main_region_on_r1_street_green(self): + """Default exit sequence for state StreetGreen. + """ + #Default exit sequence for state StreetGreen + self.__state_vector[0] = self.State.null_state + + def __exit_sequence_main_region_on_r1_ped_waiting(self): + """Default exit sequence for state PedWaiting. + """ + #Default exit sequence for state PedWaiting + self.__exit_sequence_main_region_on_r1_ped_waiting_r1() + self.__exit_action_main_region_on_r1_ped_waiting() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Default exit sequence for state waitOn. + """ + #Default exit sequence for state waitOn + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_ped_waiting_r1_wait_on() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Default exit sequence for state waitOff. + """ + #Default exit sequence for state waitOff + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_ped_waiting_r1_wait_off() + + def __exit_sequence_main_region_on_r1_street_attention(self): + """Default exit sequence for state StreetAttention. + """ + #Default exit sequence for state StreetAttention + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_attention() + + def __exit_sequence_main_region_on_r1_street_red(self): + """Default exit sequence for state StreetRed. + """ + #Default exit sequence for state StreetRed + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_red() + + def __exit_sequence_main_region_on_r1_pedestrian_green(self): + """Default exit sequence for state PedestrianGreen. + """ + #Default exit sequence for state PedestrianGreen + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_pedestrian_green() + + def __exit_sequence_main_region_on_r1_pedestrian_red(self): + """Default exit sequence for state PedestrianRed. + """ + #Default exit sequence for state PedestrianRed + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_pedestrian_red() + + def __exit_sequence_main_region_on_r1_street_prepare(self): + """Default exit sequence for state StreetPrepare. + """ + #Default exit sequence for state StreetPrepare + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_prepare() + + def __exit_sequence_main_region_on_r1_safe(self): + """Default exit sequence for state Safe. + """ + #Default exit sequence for state Safe + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_safe() + + def __exit_sequence_main_region_off(self): + """Default exit sequence for state off. + """ + #Default exit sequence for state off + self.__exit_sequence_main_region_off_r1() + + def __exit_sequence_main_region_off_r1_yellow_on(self): + """Default exit sequence for state YellowOn. + """ + #Default exit sequence for state YellowOn + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_off_r1_yellow_on() + + def __exit_sequence_main_region_off_r1_yellow_off(self): + """Default exit sequence for state YellowOff. + """ + #Default exit sequence for state YellowOff + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_off_r1_yellow_off() + + def __exit_sequence_main_region(self): + """Default exit sequence for region main region. + """ + #Default exit sequence for region main region + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__exit_sequence_main_region_on_r1_street_green() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1street_attention: + self.__exit_sequence_main_region_on_r1_street_attention() + elif state == self.State.main_region_on_r1street_red: + self.__exit_sequence_main_region_on_r1_street_red() + elif state == self.State.main_region_on_r1pedestrian_green: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + elif state == self.State.main_region_on_r1pedestrian_red: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + elif state == self.State.main_region_on_r1street_prepare: + self.__exit_sequence_main_region_on_r1_street_prepare() + elif state == self.State.main_region_on_r1safe: + self.__exit_sequence_main_region_on_r1_safe() + elif state == self.State.main_region_off_r1yellow_on: + self.__exit_sequence_main_region_off_r1_yellow_on() + elif state == self.State.main_region_off_r1yellow_off: + self.__exit_sequence_main_region_off_r1_yellow_off() + + def __exit_sequence_main_region_on_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__exit_sequence_main_region_on_r1_street_green() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1street_attention: + self.__exit_sequence_main_region_on_r1_street_attention() + elif state == self.State.main_region_on_r1street_red: + self.__exit_sequence_main_region_on_r1_street_red() + elif state == self.State.main_region_on_r1pedestrian_green: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + elif state == self.State.main_region_on_r1pedestrian_red: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + elif state == self.State.main_region_on_r1street_prepare: + self.__exit_sequence_main_region_on_r1_street_prepare() + elif state == self.State.main_region_on_r1safe: + self.__exit_sequence_main_region_on_r1_safe() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + + def __exit_sequence_main_region_off_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_off_r1yellow_on: + self.__exit_sequence_main_region_off_r1_yellow_on() + elif state == self.State.main_region_off_r1yellow_off: + self.__exit_sequence_main_region_off_r1_yellow_off() + + def __react_main_region__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_off_default() + + def __react_main_region_on_r1_ped_waiting_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default() + + def __react_main_region_on_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_on_r1_safe_default() + + def __react_main_region_off_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_off_r1_yellow_on_default() + + def __react(self, transitioned_before): + """Implementation of __react function. + """ + #State machine reactions. + if self.__current.time_events.traffic_light_ctrl_time_event_0: + self.operation_callback.synchronize() + return transitioned_before + + + def __main_region_on_react(self, transitioned_before): + """Implementation of __main_region_on_react function. + """ + #The reactions of state on. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.on_off: + self.__exit_sequence_main_region_on() + self.__enter_sequence_main_region_off_default() + self.__react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_green_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_green_react function. + """ + #The reactions of state StreetGreen. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.pedestrian_request: + self.__exit_sequence_main_region_on_r1_street_green() + self.__enter_sequence_main_region_on_r1_ped_waiting_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_react function. + """ + #The reactions of state PedWaiting. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_attention_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_r1_wait_on_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_r1_wait_on_react function. + """ + #The reactions of state waitOn. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = False + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_off_default() + self.__main_region_on_r1_ped_waiting_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_r1_ped_waiting_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_r1_wait_off_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_r1_wait_off_react function. + """ + #The reactions of state waitOff. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = False + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default() + self.__main_region_on_r1_ped_waiting_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_r1_ped_waiting_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_attention_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_attention_react function. + """ + #The reactions of state StreetAttention. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0: + self.__exit_sequence_main_region_on_r1_street_attention() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_red_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_red_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_red_react function. + """ + #The reactions of state StreetRed. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0: + self.__exit_sequence_main_region_on_r1_street_red() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = False + self.__enter_sequence_main_region_on_r1_pedestrian_green_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_pedestrian_green_react(self, transitioned_before): + """Implementation of __main_region_on_r1_pedestrian_green_react function. + """ + #The reactions of state PedestrianGreen. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = False + self.__enter_sequence_main_region_on_r1_pedestrian_red_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_pedestrian_red_react(self, transitioned_before): + """Implementation of __main_region_on_r1_pedestrian_red_react function. + """ + #The reactions of state PedestrianRed. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_prepare_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_prepare_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_prepare_react function. + """ + #The reactions of state StreetPrepare. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0: + self.__exit_sequence_main_region_on_r1_street_prepare() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_green_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_safe_react(self, transitioned_before): + """Implementation of __main_region_on_r1_safe_react function. + """ + #The reactions of state Safe. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0: + self.__exit_sequence_main_region_on_r1_safe() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_prepare_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_off_react(self, transitioned_before): + """Implementation of __main_region_off_react function. + """ + #The reactions of state off. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.on_off: + self.__exit_sequence_main_region_off() + self.__enter_sequence_main_region_on_default() + self.__react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__react(transitioned_before) + return transitioned_after + + + def __main_region_off_r1_yellow_on_react(self, transitioned_before): + """Implementation of __main_region_off_r1_yellow_on_react function. + """ + #The reactions of state YellowOn. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0: + self.__exit_sequence_main_region_off_r1_yellow_on() + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = False + self.__enter_sequence_main_region_off_r1_yellow_off_default() + self.__main_region_off_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_off_react(transitioned_before) + return transitioned_after + + + def __main_region_off_r1_yellow_off_react(self, transitioned_before): + """Implementation of __main_region_off_r1_yellow_off_react function. + """ + #The reactions of state YellowOff. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0: + self.__exit_sequence_main_region_off_r1_yellow_off() + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = False + self.__enter_sequence_main_region_off_r1_yellow_on_default() + self.__main_region_off_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_off_react(transitioned_before) + return transitioned_after + + + def __swap_in_events(self): + """Implementation of __swap_in_events function. + """ + self.__current.iface.pedestrian_request = self.pedestrian_request + self.pedestrian_request = False + self.__current.iface.on_off = self.on_off + self.on_off = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = self.__time_events[0] + self.__time_events[0] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = self.__time_events[1] + self.__time_events[1] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = self.__time_events[2] + self.__time_events[2] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = self.__time_events[3] + self.__time_events[3] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = self.__time_events[4] + self.__time_events[4] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = self.__time_events[5] + self.__time_events[5] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = self.__time_events[6] + self.__time_events[6] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = self.__time_events[7] + self.__time_events[7] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = self.__time_events[8] + self.__time_events[8] = False + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = self.__time_events[9] + self.__time_events[9] = False + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = self.__time_events[10] + self.__time_events[10] = False + self.__current.time_events.traffic_light_ctrl_time_event_0 = self.__time_events[11] + self.__time_events[11] = False + + + def __clear_in_events(self): + """Implementation of __clear_in_events function. + """ + self.pedestrian_request = False + self.on_off = False + self.__time_events[0] = False + self.__time_events[1] = False + self.__time_events[2] = False + self.__time_events[3] = False + self.__time_events[4] = False + self.__time_events[5] = False + self.__time_events[6] = False + self.__time_events[7] = False + self.__time_events[8] = False + self.__time_events[9] = False + self.__time_events[10] = False + self.__time_events[11] = False + + + def __micro_step(self): + """Implementation of __micro_step function. + """ + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__main_region_on_r1_street_green_react(-1) + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__main_region_on_r1_ped_waiting_r1_wait_on_react(-1) + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__main_region_on_r1_ped_waiting_r1_wait_off_react(-1) + elif state == self.State.main_region_on_r1street_attention: + self.__main_region_on_r1_street_attention_react(-1) + elif state == self.State.main_region_on_r1street_red: + self.__main_region_on_r1_street_red_react(-1) + elif state == self.State.main_region_on_r1pedestrian_green: + self.__main_region_on_r1_pedestrian_green_react(-1) + elif state == self.State.main_region_on_r1pedestrian_red: + self.__main_region_on_r1_pedestrian_red_react(-1) + elif state == self.State.main_region_on_r1street_prepare: + self.__main_region_on_r1_street_prepare_react(-1) + elif state == self.State.main_region_on_r1safe: + self.__main_region_on_r1_safe_react(-1) + elif state == self.State.main_region_off_r1yellow_on: + self.__main_region_off_r1_yellow_on_react(-1) + elif state == self.State.main_region_off_r1yellow_off: + self.__main_region_off_r1_yellow_off_react(-1) + + + def run_cycle(self): + """Implementation of run_cycle function. + """ + #Performs a 'run to completion' step. + if self.timer_service is None: + raise ValueError('Timer service must be set.') + + if self.operation_callback is None: + raise ValueError("Operation callback must be set.") + + if self.__is_executing: + return + self.__is_executing = True + self.__swap_in_events() + self.__micro_step() + self.__is_executing = False + + + def enter(self): + """Implementation of enter function. + """ + #Activates the state machine. + if self.timer_service is None: + raise ValueError('Timer service must be set.') + + if self.operation_callback is None: + raise ValueError("Operation callback must be set.") + + if self.__is_executing: + return + self.__is_executing = True + #Default enter sequence for statechart TrafficLightCtrl + #Entry action for statechart 'TrafficLightCtrl'. + self.timer_service.set_timer(self, 11, 200, True) + self.__enter_sequence_main_region_default() + self.__is_executing = False + + + def exit(self): + """Implementation of exit function. + """ + #Deactivates the state machine. + if self.__is_executing: + return + self.__is_executing = True + #Default exit sequence for statechart TrafficLightCtrl + self.__exit_sequence_main_region() + #Exit action for state 'TrafficLightCtrl'. + self.timer_service.unset_timer(self, 11) + self.__is_executing = False + + diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/src/trafficscene.py b/itemis.create.examples.trafficlight.python.raspberry/src/trafficscene.py similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/src/trafficscene.py rename to itemis.create.examples.trafficlight.python.raspberry/src/trafficscene.py diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/src/trafficscene2.py b/itemis.create.examples.trafficlight.python.raspberry/src/trafficscene2.py similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/src/trafficscene2.py rename to itemis.create.examples.trafficlight.python.raspberry/src/trafficscene2.py diff --git a/org.yakindu.sct.examples.codegen.python/src/__init__.py b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/__init__.py similarity index 98% rename from org.yakindu.sct.examples.codegen.python/src/__init__.py rename to itemis.create.examples.trafficlight.python.raspberry/src/yakindu/__init__.py index 25f977a9..6ead0472 100644 --- a/org.yakindu.sct.examples.codegen.python/src/__init__.py +++ b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/__init__.py @@ -1,4 +1,3 @@ - """ Empty file that initializes the package it is contained in. diff --git a/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/__init__.py b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/__init__.py new file mode 100644 index 00000000..6ead0472 --- /dev/null +++ b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/__init__.py @@ -0,0 +1,5 @@ +""" + +Empty file that initializes the package it is contained in. + +""" diff --git a/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/timer_service.py b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/timer_service.py new file mode 100644 index 00000000..44689572 --- /dev/null +++ b/itemis.create.examples.trafficlight.python.raspberry/src/yakindu/timer/timer_service.py @@ -0,0 +1,94 @@ +""" DefaultTimer module. +Generated by itemis CREATE code generator. +""" + +import threading +import time + +class TimerService: + """Default timer service for timed statecharts. + """ + + def __init__(self): + self.is_default_timer = True + self.timer_queue = {} + self.lock = threading.RLock() + + def set_timer(self, callback, event_id, interval, periodic): + """Schedule the time event. + + Checks if the given time event is already in queue and creates a + timer based on the `periodic`parameter (Single or Repeat). + + Note: statemachine class converts time from sec to milliseconds, + so do vice versa. + """ + timer_id = (callback, event_id) + if timer_id in self.timer_queue: + self.unset_timer(callback, event_id) + m_interval = float(interval)/1000.0 + if periodic is False: + self.timer_queue[timer_id] = SingleTimer(m_interval, callback, event_id) + else: + self.timer_queue[timer_id] = RepeatedTimer(m_interval, callback, event_id) + + def unset_timer(self, callback, event_id): + """Cancel a certain event identified bei `callback` and `event_id`. + """ + timer_id = (callback, event_id) + with self.lock: + if timer_id in self.timer_queue: + event_timer = self.timer_queue[timer_id] + if isinstance(event_timer, RepeatedTimer): + event_timer.stop() + else: + event_timer.single_timer.cancel() + del event_timer + + def cancel(self): + """Cancel all events that are currently running. + """ + with self.lock: + for (callback, event_id) in self.timer_queue: + self.unset_timer(callback, event_id) + + +class SingleTimer: + """Call `function` after `period` seconds. + """ + + def __init__(self, period, callback, event_id): + self.callback = callback + self.event_id = event_id + self.single_timer = threading.Timer(period, self.callback.time_elapsed, [self.event_id]) + self.single_timer.start() + +class RepeatedTimer: + """Repeat `callback` every `interval` seconds. + """ + + def __init__(self, interval, callback, event_id): + self.interval = interval + self.callback = callback + self.event_id = event_id + self.start = time.time() + self.event = threading.Event() + self.thread = threading.Thread(target=self._target) + self.thread.start() + + def _target(self): + while not self.event.wait(self._time): + self.callback.time_elapsed(self.event_id) + + @property + def _time(self): + return self.interval - ((time.time() - self.start) % self.interval) + + def stop(self): + """Stops the repeated timer. + """ + self.event.set() + try: + self.thread.join() + except RuntimeError: + print('Can not join thread') diff --git a/org.yakindu.sct.examples.trafficlight.python/.gitignore b/itemis.create.examples.trafficlight.python/.gitignore similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/.gitignore rename to itemis.create.examples.trafficlight.python/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.python/.project b/itemis.create.examples.trafficlight.python/.project similarity index 92% rename from org.yakindu.sct.examples.trafficlight.python/.project rename to itemis.create.examples.trafficlight.python/.project index 36a43024..1d10d9af 100644 --- a/org.yakindu.sct.examples.trafficlight.python/.project +++ b/itemis.create.examples.trafficlight.python/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.python + itemis.create.examples.trafficlight.python diff --git a/org.yakindu.sct.examples.trafficlight.python/.pydevproject b/itemis.create.examples.trafficlight.python/.pydevproject similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/.pydevproject rename to itemis.create.examples.trafficlight.python/.pydevproject diff --git a/org.yakindu.sct.examples.trafficlight.java/css/style.css b/itemis.create.examples.trafficlight.python/css/style.css similarity index 100% rename from org.yakindu.sct.examples.trafficlight.java/css/style.css rename to itemis.create.examples.trafficlight.python/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.python/images/TrafficLightCtrl.png b/itemis.create.examples.trafficlight.python/images/TrafficLightCtrl.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/images/TrafficLightCtrl.png rename to itemis.create.examples.trafficlight.python/images/TrafficLightCtrl.png diff --git a/org.yakindu.sct.examples.trafficlight.python/images/trafficLightGui.png b/itemis.create.examples.trafficlight.python/images/trafficLightGui.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/images/trafficLightGui.png rename to itemis.create.examples.trafficlight.python/images/trafficLightGui.png diff --git a/org.yakindu.sct.examples.trafficlight.python/images/traffic_light_python.jpg b/itemis.create.examples.trafficlight.python/images/traffic_light_python.jpg similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/images/traffic_light_python.jpg rename to itemis.create.examples.trafficlight.python/images/traffic_light_python.jpg diff --git a/org.yakindu.sct.examples.trafficlight.python/index.html b/itemis.create.examples.trafficlight.python/index.html similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/index.html rename to itemis.create.examples.trafficlight.python/index.html diff --git a/org.yakindu.sct.examples.trafficlight.python/metadata.json b/itemis.create.examples.trafficlight.python/metadata.json similarity index 89% rename from org.yakindu.sct.examples.trafficlight.python/metadata.json rename to itemis.create.examples.trafficlight.python/metadata.json index 0e89a372..0d047441 100644 --- a/org.yakindu.sct.examples.trafficlight.python/metadata.json +++ b/itemis.create.examples.trafficlight.python/metadata.json @@ -1,5 +1,5 @@ { - "id": "org.yakindu.sct.examples.trafficlight.python", + "id": "itemis.create.examples.trafficlight.python", "title": "Traffic Light (Python)", "description": "Demonstrates how to generate Python source code from a statechart.", "previewImage": "traffic_light_python.jpg", diff --git a/org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.sgen b/itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.sgen similarity index 73% rename from org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.sgen rename to itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.sgen index 04db1ca0..02776580 100644 --- a/org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.sgen +++ b/itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.sgen @@ -3,7 +3,7 @@ GeneratorModel for yakindu::python { statechart TrafficLightCtrl { feature Outlet { - targetProject = "org.yakindu.sct.examples.trafficlight.python" + targetProject = "itemis.create.examples.trafficlight.python" targetFolder = "src" } diff --git a/org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.ysc b/itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.ysc similarity index 99% rename from org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.ysc rename to itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.ysc index d9d66cc3..5ccca567 100644 --- a/org.yakindu.sct.examples.trafficlight.python/model/TrafficLightCtrl.ysc +++ b/itemis.create.examples.trafficlight.python/model/TrafficLightCtrl.ysc @@ -64,7 +64,7 @@ - + diff --git a/org.yakindu.sct.examples.trafficlight.python/src/main.py b/itemis.create.examples.trafficlight.python/src/main.py similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/src/main.py rename to itemis.create.examples.trafficlight.python/src/main.py diff --git a/itemis.create.examples.trafficlight.python/src/traffic_light_ctrl.py b/itemis.create.examples.trafficlight.python/src/traffic_light_ctrl.py new file mode 100644 index 00000000..ef5d8b39 --- /dev/null +++ b/itemis.create.examples.trafficlight.python/src/traffic_light_ctrl.py @@ -0,0 +1,1099 @@ +"""Implementation of statechart traffic_light_ctrl. +Generated by itemis CREATE code generator. +""" + + +class TrafficLightCtrl: + """Implementation of the state machine TrafficLightCtrl. + """ + + class State: + """ State Enum + """ + ( + main_region_on, + main_region_on_r1street_green, + main_region_on_r1ped_waiting, + main_region_on_r1ped_waiting_r1wait_on, + main_region_on_r1ped_waiting_r1wait_off, + main_region_on_r1street_attention, + main_region_on_r1street_red, + main_region_on_r1pedestrian_green, + main_region_on_r1pedestrian_red, + main_region_on_r1street_prepare, + main_region_on_r1safe, + main_region_off, + main_region_off_r1yellow_on, + main_region_off_r1yellow_off, + null_state + ) = range(15) + + + class EvBuf: + """Implementation of internal scope. + """ + + def __init__(self): + self.pedestrian_request = False + self.on_off = False + + class TimeEventsEvBuf: + """Implementation of internal scope. + """ + + def __init__(self): + self.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = False + self.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = False + self.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = False + self.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = False + self.traffic_light_ctrl_time_event_0 = False + + class TrafficLightCtrlEvBuf: + """Implementation of internal scope. + """ + + def __init__(self, iface, time_events): + self.iface = iface + self.time_events = time_events + + class TrafficLight: + """Implementation of scope TrafficLight. + """ + + def __init__(self, statemachine): + self.red = None + self.yellow = None + self.green = None + + self.statemachine = statemachine + + + class Pedestrian: + """Implementation of scope Pedestrian. + """ + + def __init__(self, statemachine): + self.request = None + self.red = None + self.green = None + + self.statemachine = statemachine + + + def __init__(self): + """ Declares all necessary variables including list of states, histories etc. + """ + self.traffic_light = TrafficLightCtrl.TrafficLight(self) + self.pedestrian = TrafficLightCtrl.Pedestrian(self) + + self.pedestrian_request = None + self.on_off = None + self.operation_callback = None + + + # enumeration of all states: + self.__State = TrafficLightCtrl.State + self.__state_conf_vector_changed = None + self.__state_vector = [None] * 1 + for __state_index in range(1): + self.__state_vector[__state_index] = self.State.null_state + + # for timed statechart: + self.timer_service = None + self.__time_events = [None] * 12 + + # initializations: + #Default init sequence for statechart TrafficLightCtrl + self.traffic_light.red = False + self.traffic_light.yellow = False + self.traffic_light.green = False + self.pedestrian.request = False + self.pedestrian.red = False + self.pedestrian.green = False + self.__current = self.TrafficLightCtrlEvBuf( + self.EvBuf(), + self.TimeEventsEvBuf() + ) + self.__is_executing = False + + def is_active(self): + """Checks if the state machine is active. + """ + return self.__state_vector[0] is not self.__State.null_state + + def is_final(self): + """Checks if the statemachine is final. + Always returns 'false' since this state machine can never become final. + """ + return False + + def is_state_active(self, state): + """Checks if the state is currently active. + """ + s = state + if s == self.__State.main_region_on: + return (self.__state_vector[0] >= self.__State.main_region_on)\ + and (self.__state_vector[0] <= self.__State.main_region_on_r1safe) + if s == self.__State.main_region_on_r1street_green: + return self.__state_vector[0] == self.__State.main_region_on_r1street_green + if s == self.__State.main_region_on_r1ped_waiting: + return (self.__state_vector[0] >= self.__State.main_region_on_r1ped_waiting)\ + and (self.__state_vector[0] <= self.__State.main_region_on_r1ped_waiting_r1wait_off) + if s == self.__State.main_region_on_r1ped_waiting_r1wait_on: + return self.__state_vector[0] == self.__State.main_region_on_r1ped_waiting_r1wait_on + if s == self.__State.main_region_on_r1ped_waiting_r1wait_off: + return self.__state_vector[0] == self.__State.main_region_on_r1ped_waiting_r1wait_off + if s == self.__State.main_region_on_r1street_attention: + return self.__state_vector[0] == self.__State.main_region_on_r1street_attention + if s == self.__State.main_region_on_r1street_red: + return self.__state_vector[0] == self.__State.main_region_on_r1street_red + if s == self.__State.main_region_on_r1pedestrian_green: + return self.__state_vector[0] == self.__State.main_region_on_r1pedestrian_green + if s == self.__State.main_region_on_r1pedestrian_red: + return self.__state_vector[0] == self.__State.main_region_on_r1pedestrian_red + if s == self.__State.main_region_on_r1street_prepare: + return self.__state_vector[0] == self.__State.main_region_on_r1street_prepare + if s == self.__State.main_region_on_r1safe: + return self.__state_vector[0] == self.__State.main_region_on_r1safe + if s == self.__State.main_region_off: + return (self.__state_vector[0] >= self.__State.main_region_off)\ + and (self.__state_vector[0] <= self.__State.main_region_off_r1yellow_off) + if s == self.__State.main_region_off_r1yellow_on: + return self.__state_vector[0] == self.__State.main_region_off_r1yellow_on + if s == self.__State.main_region_off_r1yellow_off: + return self.__state_vector[0] == self.__State.main_region_off_r1yellow_off + return False + + def time_elapsed(self, event_id): + """ Mark the corresponding time event as True. + """ + if event_id in range(12): + self.__time_events[event_id] = True + + def raise_pedestrian_request(self): + """Raise method for event pedestrian_request. + """ + self.pedestrian_request = True + + def raise_on_off(self): + """Raise method for event on_off. + """ + self.on_off = True + + def __entry_action_main_region_on_r1_street_green(self): + """Entry action for state 'StreetGreen'.. + """ + #Entry action for state 'StreetGreen'. + self.traffic_light.red = False + self.traffic_light.yellow = False + self.traffic_light.green = True + self.pedestrian.red = True + self.pedestrian.green = False + self.pedestrian.request = False + + def __entry_action_main_region_on_r1_ped_waiting(self): + """Entry action for state 'PedWaiting'.. + """ + #Entry action for state 'PedWaiting'. + self.timer_service.set_timer(self, 0, (7 * 1000), False) + + def __entry_action_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Entry action for state 'waitOn'.. + """ + #Entry action for state 'waitOn'. + self.timer_service.set_timer(self, 1, 500, False) + self.pedestrian.request = True + + def __entry_action_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Entry action for state 'waitOff'.. + """ + #Entry action for state 'waitOff'. + self.timer_service.set_timer(self, 2, 500, False) + self.pedestrian.request = False + + def __entry_action_main_region_on_r1_street_attention(self): + """Entry action for state 'StreetAttention'.. + """ + #Entry action for state 'StreetAttention'. + self.timer_service.set_timer(self, 3, (2 * 1000), False) + self.traffic_light.red = False + self.traffic_light.yellow = True + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_street_red(self): + """Entry action for state 'StreetRed'.. + """ + #Entry action for state 'StreetRed'. + self.timer_service.set_timer(self, 4, (2 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = False + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_pedestrian_green(self): + """Entry action for state 'PedestrianGreen'.. + """ + #Entry action for state 'PedestrianGreen'. + self.timer_service.set_timer(self, 5, (7 * 1000), False) + self.pedestrian.red = False + self.pedestrian.green = True + + def __entry_action_main_region_on_r1_pedestrian_red(self): + """Entry action for state 'PedestrianRed'.. + """ + #Entry action for state 'PedestrianRed'. + self.timer_service.set_timer(self, 6, (5 * 1000), False) + self.pedestrian.red = True + self.pedestrian.green = False + + def __entry_action_main_region_on_r1_street_prepare(self): + """Entry action for state 'StreetPrepare'.. + """ + #Entry action for state 'StreetPrepare'. + self.timer_service.set_timer(self, 7, (2 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = True + self.traffic_light.green = False + + def __entry_action_main_region_on_r1_safe(self): + """Entry action for state 'Safe'.. + """ + #Entry action for state 'Safe'. + self.timer_service.set_timer(self, 8, (10 * 1000), False) + self.traffic_light.red = True + self.traffic_light.yellow = False + self.traffic_light.green = False + self.pedestrian.red = True + self.pedestrian.green = False + self.pedestrian.request = False + + def __entry_action_main_region_off(self): + """Entry action for state 'off'.. + """ + #Entry action for state 'off'. + self.traffic_light.red = False + self.traffic_light.green = False + self.traffic_light.yellow = False + self.pedestrian.red = False + self.pedestrian.green = False + + def __entry_action_main_region_off_r1_yellow_on(self): + """Entry action for state 'YellowOn'.. + """ + #Entry action for state 'YellowOn'. + self.timer_service.set_timer(self, 9, 500, False) + self.traffic_light.yellow = True + self.pedestrian.request = True + + def __entry_action_main_region_off_r1_yellow_off(self): + """Entry action for state 'YellowOff'.. + """ + #Entry action for state 'YellowOff'. + self.timer_service.set_timer(self, 10, 500, False) + self.traffic_light.yellow = False + self.pedestrian.request = False + + def __exit_action_main_region_on_r1_ped_waiting(self): + """Exit action for state 'PedWaiting'.. + """ + #Exit action for state 'PedWaiting'. + self.timer_service.unset_timer(self, 0) + self.pedestrian.request = False + + def __exit_action_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Exit action for state 'waitOn'.. + """ + #Exit action for state 'waitOn'. + self.timer_service.unset_timer(self, 1) + + def __exit_action_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Exit action for state 'waitOff'.. + """ + #Exit action for state 'waitOff'. + self.timer_service.unset_timer(self, 2) + + def __exit_action_main_region_on_r1_street_attention(self): + """Exit action for state 'StreetAttention'.. + """ + #Exit action for state 'StreetAttention'. + self.timer_service.unset_timer(self, 3) + + def __exit_action_main_region_on_r1_street_red(self): + """Exit action for state 'StreetRed'.. + """ + #Exit action for state 'StreetRed'. + self.timer_service.unset_timer(self, 4) + + def __exit_action_main_region_on_r1_pedestrian_green(self): + """Exit action for state 'PedestrianGreen'.. + """ + #Exit action for state 'PedestrianGreen'. + self.timer_service.unset_timer(self, 5) + + def __exit_action_main_region_on_r1_pedestrian_red(self): + """Exit action for state 'PedestrianRed'.. + """ + #Exit action for state 'PedestrianRed'. + self.timer_service.unset_timer(self, 6) + + def __exit_action_main_region_on_r1_street_prepare(self): + """Exit action for state 'StreetPrepare'.. + """ + #Exit action for state 'StreetPrepare'. + self.timer_service.unset_timer(self, 7) + + def __exit_action_main_region_on_r1_safe(self): + """Exit action for state 'Safe'.. + """ + #Exit action for state 'Safe'. + self.timer_service.unset_timer(self, 8) + + def __exit_action_main_region_off_r1_yellow_on(self): + """Exit action for state 'YellowOn'.. + """ + #Exit action for state 'YellowOn'. + self.timer_service.unset_timer(self, 9) + + def __exit_action_main_region_off_r1_yellow_off(self): + """Exit action for state 'YellowOff'.. + """ + #Exit action for state 'YellowOff'. + self.timer_service.unset_timer(self, 10) + + def __enter_sequence_main_region_on_default(self): + """'default' enter sequence for state on. + """ + #'default' enter sequence for state on + self.__enter_sequence_main_region_on_r1_default() + + def __enter_sequence_main_region_on_r1_street_green_default(self): + """'default' enter sequence for state StreetGreen. + """ + #'default' enter sequence for state StreetGreen + self.__entry_action_main_region_on_r1_street_green() + self.__state_vector[0] = self.State.main_region_on_r1street_green + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_ped_waiting_default(self): + """'default' enter sequence for state PedWaiting. + """ + #'default' enter sequence for state PedWaiting + self.__entry_action_main_region_on_r1_ped_waiting() + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_default() + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default(self): + """'default' enter sequence for state waitOn. + """ + #'default' enter sequence for state waitOn + self.__entry_action_main_region_on_r1_ped_waiting_r1_wait_on() + self.__state_vector[0] = self.State.main_region_on_r1ped_waiting_r1wait_on + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_wait_off_default(self): + """'default' enter sequence for state waitOff. + """ + #'default' enter sequence for state waitOff + self.__entry_action_main_region_on_r1_ped_waiting_r1_wait_off() + self.__state_vector[0] = self.State.main_region_on_r1ped_waiting_r1wait_off + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_attention_default(self): + """'default' enter sequence for state StreetAttention. + """ + #'default' enter sequence for state StreetAttention + self.__entry_action_main_region_on_r1_street_attention() + self.__state_vector[0] = self.State.main_region_on_r1street_attention + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_red_default(self): + """'default' enter sequence for state StreetRed. + """ + #'default' enter sequence for state StreetRed + self.__entry_action_main_region_on_r1_street_red() + self.__state_vector[0] = self.State.main_region_on_r1street_red + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_pedestrian_green_default(self): + """'default' enter sequence for state PedestrianGreen. + """ + #'default' enter sequence for state PedestrianGreen + self.__entry_action_main_region_on_r1_pedestrian_green() + self.__state_vector[0] = self.State.main_region_on_r1pedestrian_green + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_pedestrian_red_default(self): + """'default' enter sequence for state PedestrianRed. + """ + #'default' enter sequence for state PedestrianRed + self.__entry_action_main_region_on_r1_pedestrian_red() + self.__state_vector[0] = self.State.main_region_on_r1pedestrian_red + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_street_prepare_default(self): + """'default' enter sequence for state StreetPrepare. + """ + #'default' enter sequence for state StreetPrepare + self.__entry_action_main_region_on_r1_street_prepare() + self.__state_vector[0] = self.State.main_region_on_r1street_prepare + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_on_r1_safe_default(self): + """'default' enter sequence for state Safe. + """ + #'default' enter sequence for state Safe + self.__entry_action_main_region_on_r1_safe() + self.__state_vector[0] = self.State.main_region_on_r1safe + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_off_default(self): + """'default' enter sequence for state off. + """ + #'default' enter sequence for state off + self.__entry_action_main_region_off() + self.__enter_sequence_main_region_off_r1_default() + + def __enter_sequence_main_region_off_r1_yellow_on_default(self): + """'default' enter sequence for state YellowOn. + """ + #'default' enter sequence for state YellowOn + self.__entry_action_main_region_off_r1_yellow_on() + self.__state_vector[0] = self.State.main_region_off_r1yellow_on + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_off_r1_yellow_off_default(self): + """'default' enter sequence for state YellowOff. + """ + #'default' enter sequence for state YellowOff + self.__entry_action_main_region_off_r1_yellow_off() + self.__state_vector[0] = self.State.main_region_off_r1yellow_off + self.__state_conf_vector_changed = True + + def __enter_sequence_main_region_default(self): + """'default' enter sequence for region main region. + """ + #'default' enter sequence for region main region + self.__react_main_region__entry_default() + + def __enter_sequence_main_region_on_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_on_r1__entry_default() + + def __enter_sequence_main_region_on_r1_ped_waiting_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_on_r1_ped_waiting_r1__entry_default() + + def __enter_sequence_main_region_off_r1_default(self): + """'default' enter sequence for region r1. + """ + #'default' enter sequence for region r1 + self.__react_main_region_off_r1__entry_default() + + def __exit_sequence_main_region_on(self): + """Default exit sequence for state on. + """ + #Default exit sequence for state on + self.__exit_sequence_main_region_on_r1() + + def __exit_sequence_main_region_on_r1_street_green(self): + """Default exit sequence for state StreetGreen. + """ + #Default exit sequence for state StreetGreen + self.__state_vector[0] = self.State.null_state + + def __exit_sequence_main_region_on_r1_ped_waiting(self): + """Default exit sequence for state PedWaiting. + """ + #Default exit sequence for state PedWaiting + self.__exit_sequence_main_region_on_r1_ped_waiting_r1() + self.__exit_action_main_region_on_r1_ped_waiting() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on(self): + """Default exit sequence for state waitOn. + """ + #Default exit sequence for state waitOn + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_ped_waiting_r1_wait_on() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off(self): + """Default exit sequence for state waitOff. + """ + #Default exit sequence for state waitOff + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_ped_waiting_r1_wait_off() + + def __exit_sequence_main_region_on_r1_street_attention(self): + """Default exit sequence for state StreetAttention. + """ + #Default exit sequence for state StreetAttention + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_attention() + + def __exit_sequence_main_region_on_r1_street_red(self): + """Default exit sequence for state StreetRed. + """ + #Default exit sequence for state StreetRed + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_red() + + def __exit_sequence_main_region_on_r1_pedestrian_green(self): + """Default exit sequence for state PedestrianGreen. + """ + #Default exit sequence for state PedestrianGreen + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_pedestrian_green() + + def __exit_sequence_main_region_on_r1_pedestrian_red(self): + """Default exit sequence for state PedestrianRed. + """ + #Default exit sequence for state PedestrianRed + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_pedestrian_red() + + def __exit_sequence_main_region_on_r1_street_prepare(self): + """Default exit sequence for state StreetPrepare. + """ + #Default exit sequence for state StreetPrepare + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_street_prepare() + + def __exit_sequence_main_region_on_r1_safe(self): + """Default exit sequence for state Safe. + """ + #Default exit sequence for state Safe + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_on_r1_safe() + + def __exit_sequence_main_region_off(self): + """Default exit sequence for state off. + """ + #Default exit sequence for state off + self.__exit_sequence_main_region_off_r1() + + def __exit_sequence_main_region_off_r1_yellow_on(self): + """Default exit sequence for state YellowOn. + """ + #Default exit sequence for state YellowOn + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_off_r1_yellow_on() + + def __exit_sequence_main_region_off_r1_yellow_off(self): + """Default exit sequence for state YellowOff. + """ + #Default exit sequence for state YellowOff + self.__state_vector[0] = self.State.null_state + self.__exit_action_main_region_off_r1_yellow_off() + + def __exit_sequence_main_region(self): + """Default exit sequence for region main region. + """ + #Default exit sequence for region main region + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__exit_sequence_main_region_on_r1_street_green() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1street_attention: + self.__exit_sequence_main_region_on_r1_street_attention() + elif state == self.State.main_region_on_r1street_red: + self.__exit_sequence_main_region_on_r1_street_red() + elif state == self.State.main_region_on_r1pedestrian_green: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + elif state == self.State.main_region_on_r1pedestrian_red: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + elif state == self.State.main_region_on_r1street_prepare: + self.__exit_sequence_main_region_on_r1_street_prepare() + elif state == self.State.main_region_on_r1safe: + self.__exit_sequence_main_region_on_r1_safe() + elif state == self.State.main_region_off_r1yellow_on: + self.__exit_sequence_main_region_off_r1_yellow_on() + elif state == self.State.main_region_off_r1yellow_off: + self.__exit_sequence_main_region_off_r1_yellow_off() + + def __exit_sequence_main_region_on_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__exit_sequence_main_region_on_r1_street_green() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__exit_action_main_region_on_r1_ped_waiting() + elif state == self.State.main_region_on_r1street_attention: + self.__exit_sequence_main_region_on_r1_street_attention() + elif state == self.State.main_region_on_r1street_red: + self.__exit_sequence_main_region_on_r1_street_red() + elif state == self.State.main_region_on_r1pedestrian_green: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + elif state == self.State.main_region_on_r1pedestrian_red: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + elif state == self.State.main_region_on_r1street_prepare: + self.__exit_sequence_main_region_on_r1_street_prepare() + elif state == self.State.main_region_on_r1safe: + self.__exit_sequence_main_region_on_r1_safe() + + def __exit_sequence_main_region_on_r1_ped_waiting_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + + def __exit_sequence_main_region_off_r1(self): + """Default exit sequence for region r1. + """ + #Default exit sequence for region r1 + state = self.__state_vector[0] + if state == self.State.main_region_off_r1yellow_on: + self.__exit_sequence_main_region_off_r1_yellow_on() + elif state == self.State.main_region_off_r1yellow_off: + self.__exit_sequence_main_region_off_r1_yellow_off() + + def __react_main_region__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_off_default() + + def __react_main_region_on_r1_ped_waiting_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default() + + def __react_main_region_on_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_on_r1_safe_default() + + def __react_main_region_off_r1__entry_default(self): + """Default react sequence for initial entry . + """ + #Default react sequence for initial entry + self.__enter_sequence_main_region_off_r1_yellow_on_default() + + def __react(self, transitioned_before): + """Implementation of __react function. + """ + #State machine reactions. + if self.__current.time_events.traffic_light_ctrl_time_event_0: + self.operation_callback.synchronize() + return transitioned_before + + + def __main_region_on_react(self, transitioned_before): + """Implementation of __main_region_on_react function. + """ + #The reactions of state on. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.on_off: + self.__exit_sequence_main_region_on() + self.__enter_sequence_main_region_off_default() + self.__react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_green_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_green_react function. + """ + #The reactions of state StreetGreen. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.pedestrian_request: + self.__exit_sequence_main_region_on_r1_street_green() + self.__enter_sequence_main_region_on_r1_ped_waiting_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_react function. + """ + #The reactions of state PedWaiting. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_attention_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_r1_wait_on_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_r1_wait_on_react function. + """ + #The reactions of state waitOn. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_on() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = False + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_off_default() + self.__main_region_on_r1_ped_waiting_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_r1_ped_waiting_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_ped_waiting_r1_wait_off_react(self, transitioned_before): + """Implementation of __main_region_on_r1_ped_waiting_r1_wait_off_react function. + """ + #The reactions of state waitOff. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0: + self.__exit_sequence_main_region_on_r1_ped_waiting_r1_wait_off() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = False + self.__enter_sequence_main_region_on_r1_ped_waiting_r1_wait_on_default() + self.__main_region_on_r1_ped_waiting_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_r1_ped_waiting_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_attention_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_attention_react function. + """ + #The reactions of state StreetAttention. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0: + self.__exit_sequence_main_region_on_r1_street_attention() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_red_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_red_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_red_react function. + """ + #The reactions of state StreetRed. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0: + self.__exit_sequence_main_region_on_r1_street_red() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = False + self.__enter_sequence_main_region_on_r1_pedestrian_green_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_pedestrian_green_react(self, transitioned_before): + """Implementation of __main_region_on_r1_pedestrian_green_react function. + """ + #The reactions of state PedestrianGreen. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0: + self.__exit_sequence_main_region_on_r1_pedestrian_green() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = False + self.__enter_sequence_main_region_on_r1_pedestrian_red_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_pedestrian_red_react(self, transitioned_before): + """Implementation of __main_region_on_r1_pedestrian_red_react function. + """ + #The reactions of state PedestrianRed. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0: + self.__exit_sequence_main_region_on_r1_pedestrian_red() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_prepare_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_street_prepare_react(self, transitioned_before): + """Implementation of __main_region_on_r1_street_prepare_react function. + """ + #The reactions of state StreetPrepare. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0: + self.__exit_sequence_main_region_on_r1_street_prepare() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_green_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_on_r1_safe_react(self, transitioned_before): + """Implementation of __main_region_on_r1_safe_react function. + """ + #The reactions of state Safe. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0: + self.__exit_sequence_main_region_on_r1_safe() + self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = False + self.__enter_sequence_main_region_on_r1_street_prepare_default() + self.__main_region_on_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_on_react(transitioned_before) + return transitioned_after + + + def __main_region_off_react(self, transitioned_before): + """Implementation of __main_region_off_react function. + """ + #The reactions of state off. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.iface.on_off: + self.__exit_sequence_main_region_off() + self.__enter_sequence_main_region_on_default() + self.__react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__react(transitioned_before) + return transitioned_after + + + def __main_region_off_r1_yellow_on_react(self, transitioned_before): + """Implementation of __main_region_off_r1_yellow_on_react function. + """ + #The reactions of state YellowOn. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0: + self.__exit_sequence_main_region_off_r1_yellow_on() + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = False + self.__enter_sequence_main_region_off_r1_yellow_off_default() + self.__main_region_off_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_off_react(transitioned_before) + return transitioned_after + + + def __main_region_off_r1_yellow_off_react(self, transitioned_before): + """Implementation of __main_region_off_r1_yellow_off_react function. + """ + #The reactions of state YellowOff. + transitioned_after = transitioned_before + if transitioned_after < 0: + if self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0: + self.__exit_sequence_main_region_off_r1_yellow_off() + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = False + self.__enter_sequence_main_region_off_r1_yellow_on_default() + self.__main_region_off_react(0) + transitioned_after = 0 + #If no transition was taken + if transitioned_after == transitioned_before: + #then execute local reactions. + transitioned_after = self.__main_region_off_react(transitioned_before) + return transitioned_after + + + def __swap_in_events(self): + """Implementation of __swap_in_events function. + """ + self.__current.iface.pedestrian_request = self.pedestrian_request + self.pedestrian_request = False + self.__current.iface.on_off = self.on_off + self.on_off = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_time_event_0 = self.__time_events[0] + self.__time_events[0] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_on_time_event_0 = self.__time_events[1] + self.__time_events[1] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1ped_waiting_r1wait_off_time_event_0 = self.__time_events[2] + self.__time_events[2] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_attention_time_event_0 = self.__time_events[3] + self.__time_events[3] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_red_time_event_0 = self.__time_events[4] + self.__time_events[4] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_green_time_event_0 = self.__time_events[5] + self.__time_events[5] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1pedestrian_red_time_event_0 = self.__time_events[6] + self.__time_events[6] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1street_prepare_time_event_0 = self.__time_events[7] + self.__time_events[7] = False + self.__current.time_events.traffic_light_ctrl_main_region_on_r1safe_time_event_0 = self.__time_events[8] + self.__time_events[8] = False + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_on_time_event_0 = self.__time_events[9] + self.__time_events[9] = False + self.__current.time_events.traffic_light_ctrl_main_region_off_r1yellow_off_time_event_0 = self.__time_events[10] + self.__time_events[10] = False + self.__current.time_events.traffic_light_ctrl_time_event_0 = self.__time_events[11] + self.__time_events[11] = False + + + def __clear_in_events(self): + """Implementation of __clear_in_events function. + """ + self.pedestrian_request = False + self.on_off = False + self.__time_events[0] = False + self.__time_events[1] = False + self.__time_events[2] = False + self.__time_events[3] = False + self.__time_events[4] = False + self.__time_events[5] = False + self.__time_events[6] = False + self.__time_events[7] = False + self.__time_events[8] = False + self.__time_events[9] = False + self.__time_events[10] = False + self.__time_events[11] = False + + + def __micro_step(self): + """Implementation of __micro_step function. + """ + state = self.__state_vector[0] + if state == self.State.main_region_on_r1street_green: + self.__main_region_on_r1_street_green_react(-1) + elif state == self.State.main_region_on_r1ped_waiting_r1wait_on: + self.__main_region_on_r1_ped_waiting_r1_wait_on_react(-1) + elif state == self.State.main_region_on_r1ped_waiting_r1wait_off: + self.__main_region_on_r1_ped_waiting_r1_wait_off_react(-1) + elif state == self.State.main_region_on_r1street_attention: + self.__main_region_on_r1_street_attention_react(-1) + elif state == self.State.main_region_on_r1street_red: + self.__main_region_on_r1_street_red_react(-1) + elif state == self.State.main_region_on_r1pedestrian_green: + self.__main_region_on_r1_pedestrian_green_react(-1) + elif state == self.State.main_region_on_r1pedestrian_red: + self.__main_region_on_r1_pedestrian_red_react(-1) + elif state == self.State.main_region_on_r1street_prepare: + self.__main_region_on_r1_street_prepare_react(-1) + elif state == self.State.main_region_on_r1safe: + self.__main_region_on_r1_safe_react(-1) + elif state == self.State.main_region_off_r1yellow_on: + self.__main_region_off_r1_yellow_on_react(-1) + elif state == self.State.main_region_off_r1yellow_off: + self.__main_region_off_r1_yellow_off_react(-1) + + + def run_cycle(self): + """Implementation of run_cycle function. + """ + #Performs a 'run to completion' step. + if self.timer_service is None: + raise ValueError('Timer service must be set.') + + if self.operation_callback is None: + raise ValueError("Operation callback must be set.") + + if self.__is_executing: + return + self.__is_executing = True + self.__swap_in_events() + self.__micro_step() + self.__is_executing = False + + + def enter(self): + """Implementation of enter function. + """ + #Activates the state machine. + if self.timer_service is None: + raise ValueError('Timer service must be set.') + + if self.operation_callback is None: + raise ValueError("Operation callback must be set.") + + if self.__is_executing: + return + self.__is_executing = True + #Default enter sequence for statechart TrafficLightCtrl + #Entry action for statechart 'TrafficLightCtrl'. + self.timer_service.set_timer(self, 11, 200, True) + self.__enter_sequence_main_region_default() + self.__is_executing = False + + + def exit(self): + """Implementation of exit function. + """ + #Deactivates the state machine. + if self.__is_executing: + return + self.__is_executing = True + #Default exit sequence for statechart TrafficLightCtrl + self.__exit_sequence_main_region() + #Exit action for state 'TrafficLightCtrl'. + self.timer_service.unset_timer(self, 11) + self.__is_executing = False + + diff --git a/org.yakindu.sct.examples.trafficlight.python/src/traffic_scene.py b/itemis.create.examples.trafficlight.python/src/traffic_scene.py similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python/src/traffic_scene.py rename to itemis.create.examples.trafficlight.python/src/traffic_scene.py diff --git a/itemis.create.examples.trafficlight.python/src/yakindu/__init__.py b/itemis.create.examples.trafficlight.python/src/yakindu/__init__.py new file mode 100644 index 00000000..6ead0472 --- /dev/null +++ b/itemis.create.examples.trafficlight.python/src/yakindu/__init__.py @@ -0,0 +1,5 @@ +""" + +Empty file that initializes the package it is contained in. + +""" diff --git a/itemis.create.examples.trafficlight.python/src/yakindu/timer/__init__.py b/itemis.create.examples.trafficlight.python/src/yakindu/timer/__init__.py new file mode 100644 index 00000000..6ead0472 --- /dev/null +++ b/itemis.create.examples.trafficlight.python/src/yakindu/timer/__init__.py @@ -0,0 +1,5 @@ +""" + +Empty file that initializes the package it is contained in. + +""" diff --git a/itemis.create.examples.trafficlight.python/src/yakindu/timer/timer_service.py b/itemis.create.examples.trafficlight.python/src/yakindu/timer/timer_service.py new file mode 100644 index 00000000..44689572 --- /dev/null +++ b/itemis.create.examples.trafficlight.python/src/yakindu/timer/timer_service.py @@ -0,0 +1,94 @@ +""" DefaultTimer module. +Generated by itemis CREATE code generator. +""" + +import threading +import time + +class TimerService: + """Default timer service for timed statecharts. + """ + + def __init__(self): + self.is_default_timer = True + self.timer_queue = {} + self.lock = threading.RLock() + + def set_timer(self, callback, event_id, interval, periodic): + """Schedule the time event. + + Checks if the given time event is already in queue and creates a + timer based on the `periodic`parameter (Single or Repeat). + + Note: statemachine class converts time from sec to milliseconds, + so do vice versa. + """ + timer_id = (callback, event_id) + if timer_id in self.timer_queue: + self.unset_timer(callback, event_id) + m_interval = float(interval)/1000.0 + if periodic is False: + self.timer_queue[timer_id] = SingleTimer(m_interval, callback, event_id) + else: + self.timer_queue[timer_id] = RepeatedTimer(m_interval, callback, event_id) + + def unset_timer(self, callback, event_id): + """Cancel a certain event identified bei `callback` and `event_id`. + """ + timer_id = (callback, event_id) + with self.lock: + if timer_id in self.timer_queue: + event_timer = self.timer_queue[timer_id] + if isinstance(event_timer, RepeatedTimer): + event_timer.stop() + else: + event_timer.single_timer.cancel() + del event_timer + + def cancel(self): + """Cancel all events that are currently running. + """ + with self.lock: + for (callback, event_id) in self.timer_queue: + self.unset_timer(callback, event_id) + + +class SingleTimer: + """Call `function` after `period` seconds. + """ + + def __init__(self, period, callback, event_id): + self.callback = callback + self.event_id = event_id + self.single_timer = threading.Timer(period, self.callback.time_elapsed, [self.event_id]) + self.single_timer.start() + +class RepeatedTimer: + """Repeat `callback` every `interval` seconds. + """ + + def __init__(self, interval, callback, event_id): + self.interval = interval + self.callback = callback + self.event_id = event_id + self.start = time.time() + self.event = threading.Event() + self.thread = threading.Thread(target=self._target) + self.thread.start() + + def _target(self): + while not self.event.wait(self._time): + self.callback.time_elapsed(self.event_id) + + @property + def _time(self): + return self.interval - ((time.time() - self.start) % self.interval) + + def stop(self): + """Stops the repeated timer. + """ + self.event.set() + try: + self.thread.join() + except RuntimeError: + print('Can not join thread') diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/.classpath b/itemis.create.examples.trafficlight.scxml.qt/.classpath similarity index 100% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/.classpath rename to itemis.create.examples.trafficlight.scxml.qt/.classpath diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/.gitignore b/itemis.create.examples.trafficlight.scxml.qt/.gitignore similarity index 100% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/.gitignore rename to itemis.create.examples.trafficlight.scxml.qt/.gitignore diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/.project b/itemis.create.examples.trafficlight.scxml.qt/.project similarity index 89% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/.project rename to itemis.create.examples.trafficlight.scxml.qt/.project index d25c13a2..2573e53e 100644 --- a/org.yakindu.sct.examples.trafficlight.scxml.qt/.project +++ b/itemis.create.examples.trafficlight.scxml.qt/.project @@ -1,6 +1,6 @@ - org.yakindu.sct.examples.trafficlight.scxml.qt + itemis.create.examples.trafficlight.scxml.qt diff --git a/org.yakindu.sct.examples.trafficlight.python.raspberry/css/style.css b/itemis.create.examples.trafficlight.scxml.qt/css/style.css similarity index 100% rename from org.yakindu.sct.examples.trafficlight.python.raspberry/css/style.css rename to itemis.create.examples.trafficlight.scxml.qt/css/style.css diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/images/trafficlight.png b/itemis.create.examples.trafficlight.scxml.qt/images/trafficlight.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/images/trafficlight.png rename to itemis.create.examples.trafficlight.scxml.qt/images/trafficlight.png diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/images/trafficlight_example.png b/itemis.create.examples.trafficlight.scxml.qt/images/trafficlight_example.png similarity index 100% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/images/trafficlight_example.png rename to itemis.create.examples.trafficlight.scxml.qt/images/trafficlight_example.png diff --git a/org.yakindu.sct.examples.trafficlight.scxml.qt/index.html b/itemis.create.examples.trafficlight.scxml.qt/index.html similarity index 94% rename from org.yakindu.sct.examples.trafficlight.scxml.qt/index.html rename to itemis.create.examples.trafficlight.scxml.qt/index.html index e963afac..78a1bef4 100644 --- a/org.yakindu.sct.examples.trafficlight.scxml.qt/index.html +++ b/itemis.create.examples.trafficlight.scxml.qt/index.html @@ -11,7 +11,7 @@

      [Pro] Traffic Light (SCXML) for QT

      - This is a simple example for the Qt SCXML integration of YAKINDU + This is a simple example for the Qt SCXML integration of CREATE Statechart Tools. The example is inspired by the traffic light examples that can be found here. The @@ -118,12 +118,12 @@

      Run application

      Run Qt Unit tests

      You can run Qt Unit tests to test the traffic light - statemachine behaviour. For this YAKINDU Statechart Tools provides a + statemachine behaviour. For this Itemis CREATE provides a SCTUnit code generator which generates a whole Qt Unit test project.

      • Right-click on 'QtSCXMLTests.sgen' in project folder - traffic_light_qt_scxml in 'Project Explorer' of YAKINDU Statechart + traffic_light_qt_scxml in 'Project Explorer' of CREATE Statechart Tools

      • The folder 'test-gen' should be created containing the @@ -134,7 +134,7 @@

        Run Qt Unit tests

      Run statechart simulation

      -

      Additionally you can simulate the statechart in YAKINDU +

      Additionally you can simulate the statechart in CREATE Statechart Tools by right-click on the 'TrafficLightStateMachine.sct' file and choose: